<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title> blog</title>
		<link>http://www.silverstripe.org/blog/</link>
		<atom:link href="http://www.silverstripe.org/blog/" rel="self" type="application/rss+xml" />
		<description></description>

		
		<item>
			<title>Rapid Prototyping with SilverStripe &amp; Foundation</title>
			<link>http://www.silverstripe.org/rapid-prototyping-with-silverstripe-and-foundation/</link>
			<description>&lt;p&gt;&lt;em&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/Image.png&quot; alt=&quot;Ryan Wachtl&quot; title=&quot;Ryan Wachtl, SilverStripe Developer&quot; width=&quot;200&quot; height=&quot;200&quot;/&gt;Guest blogger Ryan Wachtl is an independent US-based web developer and information architect with a passion for the art of  programming and the science of design. He has been building sites with SilverStripe since the early 2.2 release and organizes the &lt;a title=&quot;SilverStripe Meetup Group. Madison&quot; href=&quot;http://www.meetup.com/madison-silverstripe/&quot;&gt;SilverStripe user group in Madison, WI&lt;/a&gt;. You can stay in touch by following &lt;a title=&quot;Ryan Wachtl on Twitter&quot; href=&quot;http://twitter.com/#%21/ryanwachtl&quot;&gt;@ryanwachtl&lt;/a&gt; on Twitter.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Fixing an Outdated Workflow&lt;/h2&gt;
&lt;p&gt;I think by now we can all agree that the traditional web project workflow, going from planning → wireframes → Photoshop comps → HTML/CSS/JavaScript → CMS integration → launch, is outdated and broken. It’s a comfortable and controlled workflow that relies heavily on hand-offs and sign-offs. The recently heightened focus on designing around content, designing for an ever growing device landscape, and emphasizing the quality of the user experience has led to the demise of this workflow.&lt;/p&gt;
&lt;p&gt;Unless you have unlimited resources it's impractical to invest in wireframes that try to cover desktop, tablet, and mobile (and all the variations in-between). The same logic follows for design comps. I’ve also seen my share of &lt;em&gt;lorem ipsum&lt;/em&gt; laden design comps that initially look great, but quickly fall apart when put into production and real content is “plugged in”. And finally, it is extremely difficult to convey interaction in static wireframes and PSDs. To get around these problems and build better solutions, I’ve come to rely heavily on rapid prototyping.&lt;/p&gt;
&lt;h2&gt;Rapid Prototyping to the Rescue&lt;/h2&gt;
&lt;p&gt;Rapid prototyping, or wireframing in code, is the process of getting your layout, content, and navigation into HTML that you can view, interact with, and test on real devices. The HTML prototype essentially replaces static wireframes and design comps. The key to successful prototyping is being able to get it into production fast and iterate on it easily.&lt;/p&gt;
&lt;h2&gt;Enter SilverStripe&lt;/h2&gt;
&lt;p&gt;I’ve adopted a workflow that combines three amazing open source projects that make prototyping not only fast, but also fun. Let’s start by taking a look at my toolbox. It’s rather minimal, but very powerful. And aside from the cost of some pen and paper, it’s all free!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wachtl’s Rapid Prototyping Toolbox&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Pen and Paper&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.silverstripe.org/stable-download/&quot;&gt;SilverStripe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/unclecheese/SilverSmith&quot;&gt;SilverSmith&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://foundation.zurb.com/&quot;&gt;Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Web Browser (usually Chrome, due to the ubiquity of Webkit)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;My Workflow&lt;/h2&gt;
&lt;p&gt;After a thorough discovery phase and understanding the goals of the stakeholders and end-users, I focus on the &lt;em&gt;structure&lt;/em&gt; and &lt;em&gt;skeleton&lt;/em&gt; of the website or application (terminology borrowed from &lt;a href=&quot;http://www.jjg.net/elements/&quot;&gt;The Elements of User Experience by Jesse James Garrett&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Structure (IA)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Sitemap&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://boxesandarrows.com/where-the-wireframes-are-special-deliverable-3/&quot;&gt;Page Description Diagrams&lt;/a&gt; and User Flows&lt;/li&gt;
&lt;li&gt;Content Templates and CMS Fields&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Skeleton (In-browser Design)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Navigation and Content Discoverability&lt;/li&gt;
&lt;li&gt;Responsive Layout&lt;/li&gt;
&lt;li&gt;Test Usability and Device Experience (think ahead, plan for variations)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Structure&lt;/h2&gt;
&lt;p&gt;I begin by taking a close look at the structure of the content from two different angles. The first angle is figuring out how the content serves the business and user goals of the project, the second is how to craft the CMS in a fashion that will reduce the friction involved with managing content entry and maintain the integrity of the design. I use page description diagrams to prioritize the content on a page and sketch out any major interactions in the form of user flow diagrams or story boards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A closer look at SilverSmith Fixtures&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using the fixtures feature in SilverSmith allows me to iterate on my sitemap quickly and with ease. If you’re not familiar with SilverSmith, it’s a fantastic CLI tool built by Uncle Cheese that features generators for SilverStripe project code, templates, and content. SilverSmith will take a _fixtures.txt file and build out a site tree from it. At this stage you can just edit your _fixtures.txt file and rebuild to test different navigation and content organization schemes.&lt;/p&gt;
&lt;div class=&quot;captionImage leftAlone&quot; style=&quot;width: 600px;&quot;&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600229-prototyping-fixtures-example.png&quot; width=&quot;600&quot; height=&quot;229&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;p class=&quot;caption&quot;&gt;silversmith build-fixtures&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Once satisfied with the sitemap I can let CMS editors in to start entering real content. Seeing the actual content in the prototype allows me to break it apart into smaller chunks (for the CMS fields) and increases the value of the prototype.&lt;/p&gt;
&lt;h2&gt;Skeleton&lt;/h2&gt;
&lt;p&gt;One of my recent works is the SilverStripe Foundation theme. A theme that I use for rapid protoyping and ocassionaly building entire sites out. It's the fastest way to get up and running with the Foundation CSS Framework in your SilverStripe project. It uses Sass, but has no other requirements to modify. Add &lt;a href=&quot;http://compass-style.org/&quot;&gt;Compass&lt;/a&gt; or &lt;a href=&quot;http://bourbon.io/&quot;&gt;Bourbon&lt;/a&gt; to complete the mix, or just roll with it, as is. The theme gives you access to most of Foundations typography classes from within the class dropdown in the HTMLEditorField and it works best when paired with the &lt;a href=&quot;https://github.com/ryanwachtl/silverstripe-foundation-forms&quot;&gt;Foundation Forms module&lt;/a&gt;. You can view a &lt;a title=&quot;SilverStripe Foundation Theme by Ryan Wachtl&quot; href=&quot;http://silverstripe-foundation.rywa.us/&quot;&gt;demo of the Foundation theme&lt;/a&gt; or &lt;a title=&quot;SilverStripe Foundation Theme on Github&quot; href=&quot;https://github.com/ryanwachtl/silverstripe-foundation&quot;&gt;grab it from Github&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;captionImage leftAlone&quot; style=&quot;width: 600px;&quot;&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600334-rywa-silverstripe-foundation-theme.png&quot; width=&quot;600&quot; height=&quot;334&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;p class=&quot;caption&quot;&gt;SilverStripe Foundation Theme&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A closer look at Foundation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The beauty of the Foundation framework lies in the ability to work almost exclusively in HTML. No jumping between template, CSS, and JavaScript files. Features such as modals, tabbed sections, and device visibility can be spun up by applying classes to your markup. While not necessarily the best approach for a production site, it works perfectly for experimenting with layout and interactions across different devices. For example, the following markup is all that is needed to code a functioning modal.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600241-prototyping-modal-example.png&quot; width=&quot;600&quot; height=&quot;241&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2&gt;Beyond the Prototype&lt;/h2&gt;
&lt;p&gt;So, where to from here? A visual design process can be run in parallel with prototyping. I recommend using a process like &lt;a href=&quot;http://styletil.es/&quot;&gt;Style Tiles&lt;/a&gt;. Style Tiles are a design deliverable consisting of fonts, colors and interface elements that communicate the essence of a visual brand for the web. The perfect companion to a responsive website prototype.&lt;/p&gt;
&lt;h2&gt;Additional Resources&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SilverStripe Modules&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve only scratched the surface of SilverSmith and Foundation, you really should check them both out and see if they can find a place in your own workflow. In addition to utilizing those two projects there are a handful of other modules that I have come to rely on heavily for both prototyping and production SilverStripe projects.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;UserForms (&lt;a href=&quot;https://github.com/silverstripe/silverstripe-userforms&quot;&gt;Github&lt;/a&gt;) (&lt;a href=&quot;https://packagist.org/packages/silverstripe/userforms&quot;&gt;Packagist&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;FoundationForms (&lt;a href=&quot;https://github.com/ryanwachtl/silverstripe-foundation-forms&quot;&gt;Github&lt;/a&gt;) (&lt;a href=&quot;https://packagist.org/packages/rywa/silverstripe-foundation-forms&quot;&gt;Packagist&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;UserTemplates (&lt;a href=&quot;https://github.com/nyeholt/silverstripe-usertemplates&quot;&gt;Github&lt;/a&gt;) (&lt;a href=&quot;https://packagist.org/packages/silverstripe/usertemplates&quot;&gt;Packagist&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;HTMLField (&lt;a href=&quot;https://github.com/ryanwachtl/silverstripe-htmlfield-module&quot;&gt;Github&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;CustomMenus (&lt;a href=&quot;https://github.com/i-lateral/silverstripe-custommenus&quot;&gt;Github&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Prototyping and In-browser Design&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://viljamis.com/blog/2012/responsive-workflow/&quot;&gt;Responsive Workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://boxesandarrows.com/where-the-wireframes-are-special-deliverable-3/&quot;&gt;Page Description Diagrams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://foundation.zurb.com/&quot;&gt;Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://styletil.es/&quot;&gt;Style Tiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
			<pubDate>Wed, 29 May 2013 09:12:47 +1200</pubDate>
			
			
			<guid>http://www.silverstripe.org/rapid-prototyping-with-silverstripe-and-foundation/</guid>
		</item>
		
		<item>
			<title>On to “The news!” - News via the ModelAdmin</title>
			<link>http://www.silverstripe.org/on-to-the-news-news-via-the-modeladmin/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/2013-03-18-00.57.31.jpg&quot; width=&quot;374&quot; height=&quot;373&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;em&gt;Simon 'Sphere' Erkelens is a freelance developer, fulltime employee of &lt;a href=&quot;http://www.wecode.nl/&quot;&gt;We::Code&lt;/a&gt; in the Netherlands with a tertiary background in applied physics. Before that, Simon worked for Squal Media. He started using SilverStripe at the end of 2009. Simon has given multiple presentations on implementing Facebook API into PHP and on SilverStripe's lesser known features. Most of his personal development work is on &lt;a href=&quot;http://github.com/Firesphere&quot;&gt;Github&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I only develop core features. I'm not a front-ender of any kind. And if I have to... well, look at &lt;a href=&quot;http://casa-laguna.net&quot;&gt;my website&lt;/a&gt;. As simple as possible.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;On to... “The news!”&lt;/h3&gt;
&lt;p&gt;This news-module is compatible with Silverstripe 3.0.1 up to version 3.1. I wrote it because I got fed up with two things; first, was my own website, second was the most widely used blogmodule. It clutters the SiteTree, making it one big, confusing mess. These two factors encouraged me to write a slimmed-down version of a “news-in-the-sitetree” module.&lt;/p&gt;
&lt;p&gt;The module is fully managed from the ModelAdmin. The downside of this decision is I had to make a sacrifice. The module does not track changes in the content. To make sure articles that have a new title still work, included is a Renamed-object, which tracks the changes of the URLSegment, but that's it. This decision, was to keep it a bit more “simple”. Mainly because news is usually just edited to fix typo's, not to fully change.&lt;/p&gt;
&lt;p&gt;The news can be setup via the SiteConfig, where Twitter and Facebook (I think Facebook works) can be set up. Although those features require another module of mine. Also the amount of posts-per-page, comment-settings etc can be setup via SiteConfig.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Requirements are in the readme on my github page. Feel free to include anything from the readme config section here if needed/wanted.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Featured is comments on items. The comments are set up with a double anti-spam measure. First, there is the akismet protection as primary. But second, the well known &quot;out of screen&quot; input helps to prevent spam by having an invisible field for normal users, by positioning it absolute at -90000px or something. Spambots, however, do see the field and enter text in them. Entered text means it's a spambot.&lt;/p&gt;
&lt;p&gt;Included are several shortcodes, like YouTube, Twitter's official &quot;tweet&quot; implementation, GeSHI code-highlighting via third-party libraries. These can be activated (globally!) or deactivated via the _config.php:&lt;/p&gt;
&lt;pre&gt;ShortcodeParser::get()-&amp;gt;register('tweet',array('NewsHolderPage','TweetHandler'));&lt;br/&gt;ShortcodeParser::get()-&amp;gt;register('code',array('NewsHolderPage','GeshiParser'));&lt;br/&gt;ShortcodeParser::get()-&amp;gt;register('YT',array('NewsHolderPage','YouTubeHandler'));&lt;br/&gt;ShortcodeParser::get()-&amp;gt;register('slideshow', array('NewsHolderPage','createSlideshow'));&lt;/pre&gt;
&lt;p&gt;And addressed with, for example, [tweet id=326829146376388608] (You can find the ID by clicking the post-date and look at the URL. The full URL is accepted as well and will be split by the code to get the actual ID).&lt;/p&gt;
&lt;p&gt;Besides that, there's also an option to create tags. A tagcloud javascript is included to create the tagcloud.&lt;/p&gt;
&lt;p&gt;Newsitems are globally addressable with the Controller Extension, with a lot of options on what to show. Random, latest, latest related (via the tags) etc. The items all relate to a Holderpage. This holderpage can be translatable. By creating translatable, a new dropdown appears to set the language of the newspost. Possible future features might be to change the &quot;only on one page&quot; to &quot;link to multiple languages&quot;, since English is quite widely accepted.&lt;/p&gt;
&lt;p&gt;Furthermore, the post can have a publish from day X, which will then be preferred over the Created date. LastEdited is explicitly ignored in this case. Because often, a LastEdit just means a fix of a typo, no radical changes to the content.&lt;/p&gt;
&lt;p&gt;Finally, there are reports. In the SS3 CMS, you can see the Tag-usage and comment-counts on the items created. This includes, for example, spamcount if you have Akismet enabled. Akismet comes included as a third party.&lt;/p&gt;
&lt;p&gt;Upcoming is a report with the newsitems that don't have any tags linked. But I have not gotten into that yet.&lt;/p&gt;
&lt;p&gt;Examples and more information can be found here:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Github repository: &lt;a href=&quot;http://www.silverstripe.org/https://github.com/Firesphere/silverstripe-newsmodule&quot;&gt;https://github.com/Firesphere/silverstripe-newsmodule&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Contact: &lt;a href=&quot;mailto:simon@casa-laguna.net&quot;&gt;simon@casa-laguna.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
			<pubDate>Wed, 08 May 2013 17:03:44 +1200</pubDate>
			
			
			<guid>http://www.silverstripe.org/on-to-the-news-news-via-the-modeladmin/</guid>
		</item>
		
		<item>
			<title>Improved Config API and secure default template casting in 3.1.0-beta3</title>
			<link>http://www.silverstripe.org/improved-config-api-and-secure-default-template-casting-in-3.1.0-beta3/</link>
			<description>&lt;p&gt;We're proud to release our third beta of SilverStripe 3.1 (&lt;a href=&quot;http://www.silverstripe.org/pre-releases/&quot;&gt;download&lt;/a&gt;), which gets us very close to the Release Candidate (RC) stage. Compared to previous beta releases, beta 3 has seen some large but unavoidable API changes. Please ensure to read the &lt;a href=&quot;http://doc.silverstripe.org/framework/en/3.1/changelogs/beta/3.1.0-beta3&quot;&gt;changelog&lt;/a&gt; and &lt;a href=&quot;http://www.silverstripe.org/ http://doc.silverstripe.org/framework/en/3.1/changelogs/3.1.0&quot;&gt;upgrading guide&lt;/a&gt;. You'll need to at least rewrite your static declarations in your &lt;em&gt;Page&lt;/em&gt; and &lt;em&gt;Page_Controller&lt;/em&gt; classes (incl. custom subclasses&lt;em&gt;)&lt;/em&gt;. Also, check that any used modules are compatible with the new beta. The easiest way to manage those dependencies is an &lt;a href=&quot;http://doc.silverstripe.org/framework/en/trunk/installation/composer&quot;&gt;installation through Composer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &quot;old way&quot; of setting configuration through static properties or methods at runtime has been deprecated with 3.0. The YAML-based &lt;a href=&quot;http://doc.silverstripe.org/framework/en/3.1/topics/configuration&quot;&gt;Config API&lt;/a&gt; which replaces it has not seen widespread use though. This changes now, with most core configuration only accessible through this API. In order to enforce this change, the visibility of statics has changed to &quot;private&quot;, which will throw errors if your codebase accesses those directly. The Config API helps us to provide a faster and cleaner bootstrap process, since less PHP files need to be autoloaded.&lt;/p&gt;
&lt;p&gt;In order to reduce the chance of accidentally allowing XSS attacks, the value of &lt;em&gt;&lt;a href=&quot;http://doc.silverstripe.org/framework/en/3.1/topics/data-types&quot;&gt;$default_cast&lt;/a&gt;&lt;/em&gt; has been changed from &lt;em&gt;HTMLText&lt;/em&gt; to &lt;em&gt;Text&lt;/em&gt;. This means that any values used in a template that haven't been explicitly cast as safe will be escaped (&lt;em&gt;&amp;lt;&lt;/em&gt; replaced with &lt;em&gt;&amp;amp;lt;&lt;/em&gt; etc). Please check your controllers and templates to see if this affects you.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;right&quot; src=&quot;http://www.silverstripe.org/assets/showaslist.jpg&quot; width=&quot;234&quot; height=&quot;162&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;On the CMS front, we're only adding a little polish. The pages list view is now more useful since it remembers the open tab and URL, meaning authors can use it as their default view. We've also added a &quot;Show children as list&quot; context menu in the tree to easily switch, and make it more feasible to manage large flat structures, such as blog entries without requiring interaction with the tree.&lt;/p&gt;
&lt;p&gt;We hope you enjoy beta 3!&lt;/p&gt;</description>
			<pubDate>Mon, 22 Apr 2013 08:59:38 +1200</pubDate>
			
			
			<guid>http://www.silverstripe.org/improved-config-api-and-secure-default-template-casting-in-3.1.0-beta3/</guid>
		</item>
		
		<item>
			<title>SXSW 2013: A Mixed Bag</title>
			<link>http://www.silverstripe.org/sxsw-2013-a-mixed-bag/</link>
			<description>&lt;p&gt;&lt;em&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage315315-2_3.jpg&quot; width=&quot;315&quot; height=&quot;315&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;Richard is a designer/developer/strategist/coffee addict/Twitter   junkie/slash/slash/slash. He's been working with SilverStripe since 2009   and runs his own company &lt;a href=&quot;http://designplusawesome.com/&quot;&gt;design + awesome&lt;/a&gt;. In 2012, Richard blogged about &lt;a href=&quot;http://www.silverstripe.org/omnioutliner-to-silverstripe-site/&quot;&gt;OmniOutliner to SilverStripe&lt;/a&gt;. Find him on twitter &lt;a href=&quot;https://twitter.com/thezenmonkey&quot;&gt;@thezenmonkey.&lt;br/&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Every March, tens of thousands of filmmakers, marketers, designers and musicians from around the world descend on Austin, TX for &lt;a href=&quot;http://sxsw.com/&quot;&gt;South By South West&lt;/a&gt; (SXSW). What started as a humble music festival has grown into a city-wide event crossing industry and cultural boundaries.&lt;/p&gt;
&lt;p&gt;Lee Blazek (&lt;a href=&quot;https://twitter.com/surfjedi&quot;&gt;@surfjedi&lt;/a&gt;) and Richard Rudy (&lt;a href=&quot;https://twitter.com/thezenmonkey&quot;&gt;@thezenmonkey&lt;/a&gt;) - two SilverStripe developers from opposite sides of the globe, met in blur of jet lag and daylight savings.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600434-photo-3.jpg&quot; width=&quot;600&quot; height=&quot;434&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The breadth and depth of this conference can be overwhelming for first-time attendees. Multiple simultaneous streams covering marketing, social media, music, film, design and development across multiple industries is enough to make anyone's head spin; and that's before you include workshops, networking events, concerts, parties and lounges. Where else can you see Nick Cave talk about his childhood, then go to a demo of Google Glass, followed by an in-depth HTML5 workshop or a panel with Joss Whedon, and close your night with a party featuring Deadmou5, Vampire Weekend or Prince?&lt;/p&gt;
&lt;h2&gt;Highlights&lt;/h2&gt;
&lt;h3&gt;Google Glass Will Change the Way You See Things&lt;/h3&gt;
&lt;p&gt;Beyond the obvious amazing things that can be done with a wearable heads-up-display, the Mirror API allows devs to directly interact with RESTful services, meaning your SilverStripe sites and apps can easily be integrated. How cool is that!&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://artcopycode.com&quot;&gt;Google Art, Copy Code&lt;/a&gt; - Bringing the Hacker to traditional Art Director/Copywriter team&lt;/h3&gt;
&lt;p&gt;Google has partnered with advertising agencies to bring a whole new level of personalization and relevance to the advertising. Right now, it's just a series of experiments and an &lt;a href=&quot;http://smileage.vw.com&quot;&gt;app&lt;/a&gt; they developed in partnership with Volkswagen, but they demoed a talking shoe (no, Google is not getting into the shoe business) that uses accelerometers and GPS to track the user and give feedback. The lazy version complains if you walk to much, while the active one doesn't want to sit still.&lt;/p&gt;
&lt;p&gt;One of the more interesting demos was the dynamic video that pulls current location and time of day to generate a video with live time, weather, plus footage of up-to-date feeds from a variety of sources.  Notes from the talk are posted on &lt;a href=&quot;http://atweetsnotenough.com/post/45079119975/how-will-art-copy-code-re-imagine-advertising&quot;&gt;Rick's Tumblr.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.leapmotion.com&quot;&gt;LEAP Motion&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This product may be less relevant to web developers, but LEAP Motion had live, hands-on demos of their 3D motion tracking device. Imagine playing Fruit Ninja by swiping your finger through the air or manipulating 3D datasets with your hands. The technology is already small and affordable; it begins shipping in May. At gen 1, it's the size of a large USB key. Just wait until they get small enough to pair it Google Glass.&lt;/p&gt;
&lt;h3&gt;Intentionally Dealing with Responsive Design with &lt;a href=&quot;http://intentionjs.com&quot;&gt;intention.js&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The design technologists at Dow Jones (Wall Street Journal) have developed a javascript library that works like media queries on steroids. Its core ideals are that HTML, CSS and JS should be separate; and that content and context (device) are exclusive but need to interact. At its most basic level it does DOM manipulation based on various parameters (screen size, input type, device orientation).&lt;/p&gt;
&lt;p&gt;This library solves one of the key issues with responsive design: document order doesn't always coincide with visual importance of items on the page. With a multi-column desktop layout, often your secondary items are in another column from your main content and therefore further down the page. When you load the page on a mobile device, that secondary item is multiple page scrolls down instead of  in a position of secondary importance. Intention.js will move it to its correct space using only data attributes in the HTML.&lt;/p&gt;
&lt;p&gt;That's the functionality at its most basic level, but it can handle dynamic resource loading, animation, feature sniffing, class rewriting and more. The best part? It's fully extensible.&lt;/p&gt;
&lt;p&gt;This was a four-hour session and I could write a whole post about contents.&lt;/p&gt;
&lt;h3&gt;Tim Ferriss - Acquiring the Skill of Meta-Learning&lt;/h3&gt;
&lt;p&gt;Tim Ferris (The 4-hour Work Week, The 4-hour Body) gave a talk on his new book The 4-hour Chef. Cooking is just a vehicle for what the book is really about: how to learn any skill quickly. He shared what he calls the DiSSS framework. In order to master a skill you need Deconstruction, Selection, Sequencing, Stakes, and Simplification. A more detailed run-down of his talk is available here on &lt;a href=&quot;http://intentionjs.comhttp://atweetsnotenough.com/post/44976803679/acquiring-the-skill-of-meta-learning-my-notes&quot;&gt;Rick's Tumblr&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The Food or &quot;Oh, the Places You Will Eat!&quot;&lt;/h3&gt;
&lt;p&gt;You can't talk about South-By without mentioning the food. Austin is a great place to eat. I could write an entire post about the food.&lt;/p&gt;
&lt;p&gt;Last year's Top Chef winner curated a Food Truck Court (South Bites) with some of the best food trucks from the region. My favourite by far was Chi-Lantro, Korean-Mexican fusion food. Their bulgogi tacos with kimchi were amazing. This year I also made it out to Franklin BBQ, arguably the best BBQ in the US. The three-hour line-up was pretty standard (and not just for SXSW) and well worth it.&lt;/p&gt;
&lt;h3&gt;SXSW was a mixed bag this year&lt;/h3&gt;
&lt;p&gt;Though there were some great tech demo's and some really interesting sessions this year, SXSW is suffering some growing pains. The media has been saying it's getting too big, and they may be partially right.&lt;/p&gt;
&lt;p&gt;The conference spans  most of the downtown core which creates a bit of logistic nightmare to a conference goer. Getting into the sessions you really want often means sitting through the one before it to ensure you get a seat, or skipping a really interesting event to get to another venue.&lt;/p&gt;
&lt;h3&gt;Is it worth the trip to Austin?&lt;/h3&gt;
&lt;p&gt;Despite logistic problems, the tendency to get overwhelmed and the uncharacteristicly wet weather, SXSW is still the go-to conference, especially if you're interested in a variety of subjects. It's a unique experience every designer, developer, community manager, entrepreneur, film maker and/or musician should experience at least once.&lt;/p&gt;
&lt;h3&gt;Tips for going&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;Book early as close hotels fill up fast. If you're going with a group it's often better to rent a house. (I bought my badge Day 1 and still couldn't get a walking distance hotel)&lt;/li&gt;
&lt;li&gt;Stay hydrated&lt;/li&gt;
&lt;li&gt;Plan your days &lt;/li&gt;
&lt;li&gt;Talk to everyone (some of the best conversations happen outside of events)&lt;/li&gt;
&lt;li&gt;Be flexible (have back-up plans just incase your session is full)&lt;/li&gt;
&lt;/ul&gt;</description>
			<pubDate>Tue, 26 Mar 2013 14:41:53 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/sxsw-2013-a-mixed-bag/</guid>
		</item>
		
		<item>
			<title>Web Developers do it on the fly</title>
			<link>http://www.silverstripe.org/web-developers-do-it-on-the-fly/</link>
			<description>&lt;p&gt;&lt;em&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/Russ.jpg&quot; width=&quot;216&quot; height=&quot;144&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;a href=&quot;http://www.silverstripe.com/about-us/team/development/russell-michell/&quot;&gt;Russell Michell&lt;/a&gt; describes himself in the context of work as an absolute web all-rounder, as comfortable on the command-line as he is with the front-end. Originally from Cambridge, UK he has performed his craft for startups, academia and agencies in the UK, Australia and in the years since his first OE to New Zealand back in '99. Russell is a web developer at SilverStripe in Wellington, having joined the company in 2011.&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Usually when web developers read the words &quot;on&quot;, &quot;fly&quot; and &quot;the&quot; (usually in a different order) various tech-solutions to as-yet-undefined problems present themselves, perhaps involving near real time data processing, AJAX UI interactions or some kind of HTML5 web-socket or Node application.&lt;/p&gt;
&lt;p&gt;But not quite in this case.&lt;/p&gt;
&lt;p&gt;My position is that the best place to apply the thinking and techniques orientated around application and site performance optimisation is &quot;on-the-fly&quot; during development. The opposite of this might be understood in a more traditional optimization project; a poorly performing app or site undergoes a major overhaul, performance is evaluated and tools are deployed, code is refactored, cut down or removed, tests are run and performance then re-evaluated - rinse and repeat as time/budget allows.&lt;/p&gt;
&lt;p&gt;As a company or an individual, possession of a legacy project requiring such a process is not necessarily such a crime. Given the rapid pace of browser development of recent years and the ever-increasing range of technologies able to be deployed to public-facing projects, it is wholly understandable - if not forgivable - that feature creep and some bloat occur without due attention being paid to performance in terms of response-times and other performance metrics. Unfortunately it is precisely this lack of attention that incurs the technical debt which ensures that the single optimisation project becomes necessary in the first place.&lt;/p&gt;
&lt;p&gt;I have worked on some very similar optimisation projects in the past and it's that experience that I draw upon as I develop features in the stuff I work on today. I can't help but see potential bottlenecks in logic or the way some feature or other is assembled.&lt;/p&gt;
&lt;p&gt;Arguably the first point of call in any such optimization project is to reduce HTTP requests back to the server. The ease with which AJAX interactions can be coded with modern JavaScript libraries means it's all too easy to overlook the server load they generate. Just break out your browser debugger in network mode, and watch all those XHR requests fly past. The same goes for server-side redirects which still do little to impress non-sighted web users and when under load, the webservers themselves.&lt;/p&gt;
&lt;p&gt;So as I code I'm already thinking about whether the functionality afforded by particular AJAX controller request for example might be combined with others to kill several birds with one projectile.&lt;/p&gt;
&lt;p&gt;Depending on a team's development methodology, developers may argue that the full feature-set needs to be built first and refined afterwards as time and budget allow. While I agree that this sounds logical; to deal to everything in one hit, it does seem unfortunate that it is also this thinking that can lead to this refining step never actually being taken, and the public having 1Mb+ homepages foisted upon them. &lt;/p&gt;
&lt;p&gt;With HTTP I'm able to use standard browser-based debugging tools to monitor activity. However, if a feature or application relies upon disk i/o and that feature needs to function well under load, I'll likely want to look at reducing or precluding as much of this activity as possible given that writing to a disk platter is much slower than writing to memory. Recalling an old Facebook engineering blog entry, the author described the reduction of what sounded like an initially minuscule disk i/o time, to an even tinier number. Given the sheer number of requests each node in the Facebook CDN likely receives, these minute optimizations made sense when scaled-up.&lt;/p&gt;
&lt;p&gt;Note: I'm not really advocating the use of i/o analysis tools in the application development stage (though they would do no harm), rather I'm suggesting to remain aware of an application or feature's reads and writes, and how you might code them differently.&lt;/p&gt;
&lt;p&gt;Many development frameworks will provide developers APIs and functionality to combine and automatically minify assets requested on a page by page basis, and it behooves us as developers to be aware of these and make use of them. This is especially relevant given modern requirements for ever more complex applications with increasingly numerous CSS and JavaScript files hanging off each page request. In terms of the &quot;on-the-fly&quot; approach, I try not to assume that my chosen framework's automatic use of this kind of functionality precludes my having to think about what I'm writing, how I'm writing it and the context(s) under which these assets might be requested.&lt;/p&gt;
&lt;p&gt;Less is becoming more and more in this world, and this is as true for web-development as it is for anything else, from energy and carbon footprints to localized food production and transportation.&lt;/p&gt;
&lt;h3&gt;Takeaways: &lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;Think about performance while you work as well as afterwards. Not everyone's ISP offers the same performance as your office's T1 connection&lt;/li&gt;
&lt;li&gt;Start by monitoring how your application or feature performs using some of the free tools listed below&lt;/li&gt;
&lt;li&gt;Reduce HTTP requests back to the server (AJAX, redirects etc)&lt;/li&gt;
&lt;li&gt;Study all AJAX requests, especially those that are run just for an initial page load (ie: content that could be pre-loaded as HTML by the server before the page is served).&lt;/li&gt;
&lt;li&gt;Fish and chips for tea&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Useful links:&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.projectx.co.nz/2011/07/homepage-hall-of-shame-july-2011/&quot;&gt;Blog post and WDCNZ optimization talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.stevesouders.com/&quot;&gt;Steve Souders&lt;/a&gt;, author and speaker on all optimization-related topics: @souders&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/speed/pagespeed/insights_extensions&quot;&gt;Google PageSpeed browser addon for Firefox and Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://developer.yahoo.com/yslow/&quot;&gt;Yahoo Yslow browser addon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.facebook.com/note.php?note_id=76191543919&quot;&gt;Facebook on Disk I/O&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Wed, 13 Mar 2013 10:02:37 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/web-developers-do-it-on-the-fly/</guid>
		</item>
		
		<item>
			<title>Converting Quinn.com from SilverStripe 2.4 to 3.1-beta</title>
			<link>http://www.silverstripe.org/converting-quinn.com-from-silverstripe-2.4-to-3.1-beta/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage117157-FredCondo.jpg&quot; width=&quot;117&quot; height=&quot;157&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;em&gt;Fred Condo has a Ph.D. in the Management of Information Systems and Cognitive Psychology from Claremont Graduate School, and is Chief Engineer at Quinn Interactive. Quinn Interactive is a web design &amp;amp; development firm located in San Francisco, California specializing in interactive design, content-management integration, IA, and custom development. Fred got into SilverStripe in 2008. He has made 24 commits to the SilverStripe framework repository, which makes him the 28th-most prolific contributor to the project. You should follow him on GitHub &lt;a href=&quot;https://github.com/oddnoc&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h2/&gt;
&lt;h2&gt;tl;dr&lt;em&gt; &lt;/em&gt;&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;We did a 2.4 → 3.1-beta conversion&lt;/li&gt;
&lt;li&gt;We made the minimal changes required to get the site running under the new framework&lt;/li&gt;
&lt;li&gt;Bye, Data Object Manager!&lt;/li&gt;
&lt;li&gt;The ORM’s new fluid syntax is great (unless you forget to save the result!)&lt;/li&gt;
&lt;li&gt;It was easy!&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;About our upgrade&lt;/h2&gt;
&lt;p&gt;When &lt;a href=&quot;http://quinn.com/&quot;&gt;QI&lt;/a&gt; began using SilverStripe, we converted our static HTML site to SilverStripe 2.3. Over time, we upgraded to 2.4, and eagerly awaited SilverStripe 3.&lt;/p&gt;
&lt;p&gt;We’ve now developed new sites starting with SilverStripe 3.0, and are ready to convert sites from 2.4. To prepare to upgrade our clients, we converted our own site. We also changed our &lt;a href=&quot;http://www.gnu.org/software/make/&quot;&gt;make–&lt;/a&gt; and &lt;a href=&quot;http://rsync.samba.org&quot;&gt;rsync-&lt;/a&gt; based deployment to something more robust, &lt;a href=&quot;http://capistranorb.com&quot;&gt;Capistrano&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;We chose to convert to SilverStripe 3.1-beta, reasoning that, by the time our clients started approving upgrade projects, 3.1 would be the generally available release. We also did not want to optimize at this stage, and do only what was necessary to run under 3.1.&lt;/p&gt;
&lt;h2&gt;Converting our code base&lt;/h2&gt;
&lt;p&gt;The conversion took 91 git commits. Twelve were Capistrano-related, so 79 commits pertained to SilverStripe and code-management overhead, such as merge commits. Because this was our learning experience, we kept changes as separate commits, rather than squash them together.&lt;/p&gt;
&lt;p&gt;Our mysite/code directory contained 2942 lines of code before the conversion, and 2820 afterwards, a reduction of 4%. Our template files had 1399 lines before, and 1366 afterwards, a 2.4% reduction.&lt;/p&gt;
&lt;h2&gt;Template changes&lt;/h2&gt;
&lt;p&gt;The new template engine is strict about include files, so it uncovered includes that referenced nonexistent files. We just removed those lines.&lt;br/&gt;&lt;br/&gt;&amp;lt;% loop %&amp;gt; does what &amp;lt;% control %&amp;gt; once did. There is other new syntax, too.&lt;/p&gt;
&lt;pre&gt;```diff&lt;br/&gt;-                    &amp;lt;% if ShowInToolsPages %&amp;gt;&lt;br/&gt;-                        &amp;lt;% control ShowInToolsPages %&amp;gt;&lt;br/&gt;+                    &amp;lt;% if $ShowInToolsPages %&amp;gt;&lt;br/&gt;+                        &amp;lt;% loop $ShowInToolsPages %&amp;gt;&lt;br/&gt;                            &amp;lt;% if First %&amp;gt;&amp;lt;% else %&amp;gt; | &amp;lt;% end_if %&amp;gt;&lt;br/&gt;                            &amp;lt;a href=&quot;$Link&quot;&amp;gt;$MenuTitle&amp;lt;/a&amp;gt;&lt;br/&gt;-                        &amp;lt;% end_control %&amp;gt;&lt;br/&gt;+                        &amp;lt;% end_loop %&amp;gt;&lt;br/&gt;                    &amp;lt;% end_if %&amp;gt;&lt;br/&gt;```&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Directives now accept `$` on variable names, and `loop` replaces `control`.&lt;br/&gt;&lt;br/&gt;Template calls now take comma-separated parameters. Where we used a string with artificial delimiters, we now have a more familiar syntax. `$Image.CroppedImage(165x165)` becomes `$Image.CroppedImage(165,165)`.&lt;/p&gt;
&lt;h2&gt;PHP changes&lt;/h2&gt;
&lt;h3&gt;Module updates&lt;/h3&gt;
&lt;p&gt;We had to update modules to their 3.x-compatible versions. This often meant importing the code from the master branch. Many module repositories were not clearly tagged with 2.4– and 3.x-compatible versions. It required trial-and-error to get some modules running.&lt;/p&gt;
&lt;p&gt;We could eliminate several modules, because the new framework is more capable:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Data Object Manager &lt;/li&gt;
&lt;li&gt;Uploadify &lt;/li&gt;
&lt;li&gt;Image Extension (our internal module of image-manipulation methods; we eventually kept 2 methods—see below)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Data Object Manager by &lt;a href=&quot;http://www.leftandmain.com/&quot;&gt;Aaron “Uncle Cheese” Carlino&lt;/a&gt; is popular for SilverStripe 2.x. It is not available for 3.x, because GridField supersedes it. Here’s a sample change (from a getCMSFields() method) for replacing it:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600497-Screen-shot-2013-03-06-at-2.59.33-PM.png&quot; width=&quot;600&quot; height=&quot;497&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3/&gt;
&lt;h3&gt;ORM changes and fluid syntax&lt;/h3&gt;
&lt;p&gt;The ORM has undergone a big overhaul. DataObjectSet is gone, and a new fluid syntax simplifies data operations. To set up paginated items, we once had to manage pagination-related GET parameters, but can now focus on our custom code. Below, we use a GET parameter only for filtering on a year. See this line:&lt;/p&gt;
&lt;pre&gt;$result = $result-&amp;gt;filter('Date:StartsWith', $year);&lt;/pre&gt;
&lt;p&gt;We tripped over this when it wasn’t working without assigning back to $result . The new ORM returns a result rather than modifying the existing one. This works nicely with the fluid, chained syntax, but needs help when a call is conditional.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600329-Screen-shot-2013-03-06-at-3.04.17-PM.png&quot; width=&quot;600&quot; height=&quot;329&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;Redirection functions have moved classes&lt;/h3&gt;
&lt;p&gt;Director::redirect() and related functions have moved to Controller, and become instance methods.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600329-Screen-shot-2013-03-06-at-3.04.17-PM.png&quot; width=&quot;600&quot; height=&quot;329&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;Image extension&lt;/h3&gt;
&lt;p&gt;Here are the functions from our image extension that we still wanted after the 3.1 upgrade.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600374-Screen-shot-2013-03-06-at-3.10.53-PM.png&quot; width=&quot;600&quot; height=&quot;374&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;</description>
			<pubDate>Wed, 06 Mar 2013 11:24:29 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/converting-quinn.com-from-silverstripe-2.4-to-3.1-beta/</guid>
		</item>
		
		<item>
			<title>Wellington&#39;s February 2013 Community Meetup</title>
			<link>http://www.silverstripe.org/wellingtons-february-2013-community-meetup/</link>
			<description>&lt;p&gt;Thank you all for coming along to Molly Malone's last week! The first Wellington developer community Meetup of 2013 was held on a beautiful and warm summer evening, with great attendance (approximately 60 of you made it), conversation, and presentations.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600450-1_8.jpg&quot; width=&quot;600&quot; height=&quot;450&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;CEO Sam Minnée spoke on the upcoming user interface and developer features in &lt;a href=&quot;http://www.silverstripe.org/silverstripe-3.1.0-beta2-is-available/&quot;&gt;SilverStripe 3.1&lt;/a&gt;, most notably the side-by-side editing and device preview which helps support the emerging practice of &lt;a href=&quot;http://karenmcgrane.com/2012/09/04/adapting-ourselves-to-adaptive-content-video-slides-and-transcript-oh-my/&quot;&gt;adaptive content&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://vimeo.com/60414528&quot;&gt;Sam Minnée talks about what's new in SilverStripe 3.1&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/silverstripe&quot;&gt;SilverStripe&lt;/a&gt; on Vimeo&lt;/li&gt;
&lt;li&gt;Download Sam's &lt;a href=&quot;http://www.silverstripe.org/assets/blog/NewFolder/SilverStripe-3.1.pptx&quot; target=&quot;_blank&quot;&gt;PowerPoint presentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Developer Robert Curry then spoke about migrating websites from &lt;a href=&quot;http://www.silverstripe.org/drupal-connector-module/&quot;&gt;Drupal to SilverStripe CMS&lt;/a&gt;, with good humour and fact infused. The evening ended with a general Q+A session.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://vimeo.com/60422070&quot;&gt;Robert Curry introduces the Drupal Connector Module&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/silverstripe&quot;&gt;SilverStripe&lt;/a&gt; on Vimeo&lt;/li&gt;
&lt;li&gt;Watch Robert's &lt;a href=&quot;http://www.slideshare.net/RobertCurry/drupal-connectormodule&quot;&gt;presentation&lt;/a&gt; on SlideShare&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;If there’s something you’d like to hear or speak about at our next meetup in May, get in touch through the comments, via &lt;a title=&quot;Link to SilverStripe on Twitter&quot; href=&quot;http://www.twitter.com/SilverStripe&quot;&gt;Twitter&lt;/a&gt; and &lt;a title=&quot;Link to SilverStripe on Facebook&quot; href=&quot;https://www.facebook.com/#%21/pages/silverstripe/44641219945&quot;&gt;Facebook&lt;/a&gt;, or email &lt;a href=&quot;mailto:brooke@silverstripe.com&quot;&gt;brooke@silverstripe.com&lt;/a&gt;. If you haven't already, join our &lt;a title=&quot;Link to meetup.com&quot; href=&quot;http://www.meetup.com/SilverStripe-Wellington-Meetup-Group/&quot;&gt;meetup.com group&lt;/a&gt; for regular updates. We'll be announcing the date of the May meetup soon!&lt;/p&gt;</description>
			<pubDate>Wed, 27 Feb 2013 11:31:28 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/wellingtons-february-2013-community-meetup/</guid>
		</item>
		
		<item>
			<title>SilverStripe 3.1.0-beta2 is available</title>
			<link>http://www.silverstripe.org/silverstripe-3.1.0-beta2-is-available/</link>
			<description>&lt;p&gt;Like the subject-line says, we have a new beta release of SilverStripe 3.1 ready for you all to try.&lt;/p&gt;
&lt;p&gt;Most of the work has been on bugfixing and cleaning up APIs, so there is not a lot of new features to talk about.  Instead, the beta2 release is part of the ongoing work to get SilverStripe 3.1 ready for production.&lt;/p&gt;
&lt;p&gt;If you haven't heard about what's coming in SilverStripe 3.1, you might like to watch the recent &lt;a href=&quot;https://vimeo.com/60414528&quot;&gt;presentation&lt;/a&gt; I gave covering what's under the hood.&lt;/p&gt;
&lt;p&gt;To install a test version, you can visit &lt;a href=&quot;http://www.silverstripe.org/pre-releases/&quot;&gt;Pre-release Downloads&lt;/a&gt;, or you can use Composer.  If you already have Composer installed, you can set up a new 3.1.0-beta2 site on your computer in the directory &quot;~/Sites/newproject/&quot; by running this command: &lt;/p&gt;
&lt;pre&gt;composer create-project silverstripe/installer ~/Sites/newproject 3.1.0-beta2 &lt;/pre&gt;
&lt;p&gt;Although installing Composer is an extra step, we think that it is the best way of installing SilverStripe, because it handles module management and upgrades better than manually downloaded files.  See the &lt;a href=&quot;http://doc.silverstripe.org/framework/en/installation/composer&quot;&gt;Composer Installation Docs&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;The next release will be SilverStripe 3.1.0-RC1, which we expect to have ready late April or early May.  Between now and then, we'd appereciate any feedback and &lt;a href=&quot;http://open.silverstripe.org/newticket&quot;&gt;bug reports&lt;/a&gt; that people have.  Note that we're not going to be adding many new features between now and the stable release, so that we can focus on removing bugs.&lt;/p&gt;</description>
			<pubDate>Tue, 26 Feb 2013 14:59:44 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/silverstripe-3.1.0-beta2-is-available/</guid>
		</item>
		
		<item>
			<title>OAuth Server</title>
			<link>http://www.silverstripe.org/oauth-server/</link>
			<description>&lt;p&gt;&lt;em&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage196261-image.jpeg&quot; width=&quot;196&quot; height=&quot;261&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;Simon Welsh is a developer at &lt;a href=&quot;https://pocketrent.com&quot;&gt;PocketRent&lt;/a&gt;,  a SaaS using SilverStripe. He is currently working towards completing his  Honours degree in Computer Science and Maths, and was recently a finalist in the NZOSS awards for his development efforts within the SilverStripe community&lt;/em&gt;.&lt;em&gt; Simon has written for the SilverStripe blog before, documenting his journey of &lt;a href=&quot;http://www.silverstripe.org/upgrading-to-silverstripe-3.0/&quot;&gt;upgrading to 3.0.&lt;/a&gt; Follow Simon's alias simon_w on both &lt;a href=&quot;https://twitter.com/simon_w&quot;&gt;Twitter&lt;/a&gt; and the SilverStripe &lt;a href=&quot;http://www.silverstripe.org/irc-channel/&quot;&gt;IRC channel&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The web has moved away from disconnected sites that don't know anything about what's going on in the rest of the world. Now, almost every site that is anything beyond your bog-standard brochure site has connections to at least one other site, though usually substantially more. This can range from simple things, like using Facebook and Twitter for log ins, to more complicated integrations, such as taking payments using Stripe, recording the payment in Xero then uploading a file to SS3. These sorts of sites are said to &quot;consume&quot; others.&lt;/p&gt;
&lt;p&gt;Every so often, you want to produce a site that provides information that others can consume. Say your site is selling different types of fluffy pink slippers and you'd like other sites to be able to manage wishlists on behalf of your customers.&lt;/p&gt;
&lt;p&gt;The obvious way to do this is to build an API for your site and let other sites consume it. To make the API, you can use a pre-rolled solution like the &lt;a href=&quot;https://github.com/silverstripe/silverstripe-restfulserver/&quot;&gt;RestfulServer module&lt;/a&gt;, or you can roll your own controllers. No matter which method you choose, you also have to decide on how you are going to authenticate requests to your API.&lt;/p&gt;
&lt;p&gt;The simplest way, which is what the RestfulServer uses by default to authenticate requests, is to use basic auth. This involves sending a username and password along with every request. This approach is very easy to implement, in fact the PHP manual has a &lt;a href=&quot;http://php.net/manual/en/features.http-auth.php&quot;&gt;page&lt;/a&gt; explaining how to do it. This approach requires that the consuming service stores the user's password and any change to the user's password means the new password has to be re-entered in every third-party service. The only way for users to revoke access to a service is to change their password.&lt;/p&gt;
&lt;p&gt;To deal with some of these problems, OAuth was developed. OAuth uses tokens to authenticate requests. These tokens are issued by the provider (your site) after a user approves the client that is requesting a token. This way, the user only ever provides their password to your site, can change their password and not have to update everything and can revoke an individual app's access by revoking the particular token. OAuth also makes it easier to associate specific information with each authentication token, such as a set of permissions that a particular user has granted a particular application.&lt;/p&gt;
&lt;p&gt;OAuth 1.0 requires signing of all your requests in a very specific way that was difficult to get right. This is what Twitter uses. OAuth 2.0 with Bearer (or similar) only uses a unique token. Facebook uses a Bearer-like token system.&lt;/p&gt;
&lt;h3&gt;Introducing the OAuth server module &lt;/h3&gt;
&lt;p&gt;When beginning on the design of the PocketRent API, we decided to go with OAuth for authentication, specifically OAuth 2 using Bearer tokens. This was mostly because we decided that the tradeoffs of basic auth outweighed its simplicity. We picked version 2 of version 1, as OAuth 2 just seems more sane. The difficulties of signing and checking signatures in an OAuth 1 setup weren't that important in the decision making, as there are libraries for almost any language that do all the heavy lifting for you.&lt;/p&gt;
&lt;p&gt;Our OAuth module was designed to be applied to a controller and handle all the authentication for you. This means you just need to install the module, set up scopes and applications in the CMS, give out the generated access tokens for those applications and then the module does the rest.&lt;/p&gt;
&lt;p&gt;This module requires version 3.1 or later of the SilverStripe Framework. Due to the way PHP handles the Authorization header, support for authenticating requests using headers requires that the &lt;a href=&quot;http://php.net/getallheaders&quot;&gt;getallheaders&lt;/a&gt; method exists in your SAPI. As of PHP 5.4, this is included with the Apache and FastCGI SAPIs.&lt;/p&gt;
&lt;p&gt;The module is available from our &lt;a href=&quot;https://svn.pocketrent.com/public/oauth/trunk/&quot;&gt;SVN repository&lt;/a&gt;, or you can download a recent &lt;a href=&quot;https://pocketrent.com/assets/modules/silverstripe-oauth.zip&quot;&gt;zip&lt;/a&gt; or &lt;a href=&quot;https://pocketrent.com/assets/modules/silverstripe-oauth.tar.gz&quot;&gt;tarball&lt;/a&gt;. Installation of the module is done in the same way as any other.&lt;/p&gt;
&lt;h3&gt;Module configuration&lt;/h3&gt;
&lt;p&gt;The OAuth module comes with support for using Bearer for authentication. If you would like to use some other authentication method, you can create a class that implements the `oauth\service\Service` interface and then set the `Injector`'s `class` value for `oauth\service\Service` after the `authtokenservice` config fragment. For example, if you wanted to use the `MyAwesomeOAuthService` as the class that handles the authentication, you'd use:&lt;/p&gt;
&lt;pre&gt;&amp;lt;code type=&quot;yml&quot;&amp;gt;&lt;br/&gt;name: MyOAuth&lt;br/&gt;after: #authtokenservice&lt;br/&gt;---&lt;br/&gt;Injector:&lt;br/&gt;  &quot;oauth\service\Service&quot;:&lt;br/&gt;    class: &quot;MyAwesomeOAuthService&quot;&lt;br/&gt;&amp;lt;/code&amp;gt;&lt;/pre&gt;
&lt;p&gt;The included Bearer authentication supports different length tokens (defaults to 25 characters), token expiration (defaults to no expiration) and enabling/disabling support for authentication using POST (enabled by default) and GET (disabled by default) parameters as well as headers. These can be set by setting the `token_length` (number of characters), `token_life` (number of seconds), `allow_form_body` (boolean) and `allow_url_param` (boolean) config values on `oauth\service\Bearer` respectively. To disable token expiration, set `token_life` to a negative value. For example, to set tokens to be 30 characters, expire after an hour and to disallow both POST and GET parameters for authentication, you'd use:&lt;/p&gt;
&lt;pre&gt;&amp;lt;code type=&quot;yml&quot;&amp;gt;&lt;br/&gt;name: MyOAuth&lt;br/&gt;after: #Bearer&lt;br/&gt;---&lt;br/&gt;&quot;oauth\service\Bearer&quot;:&lt;br/&gt;  token_length: 30&lt;br/&gt;  token_life: 3600&lt;br/&gt;  allow_form_body: false&lt;br/&gt;  allow_url_param: false&lt;br/&gt;&amp;lt;/code&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Setting up the module&lt;/h3&gt;
&lt;p&gt;Once you have configured the module, the next step is to set up scopes. This is done through the CMS &lt;a href=&quot;http://yoursite.com/admin/oauth/oauth-model-Scope&quot;&gt;here&lt;/a&gt;. Here, you create new and edit existing scopes.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600366-scope-edit-form.png&quot; width=&quot;600&quot; height=&quot;366&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;With each scope you can set:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A name, which must not contain spaces and is what clients use to request that particular scope.&lt;/li&gt;
&lt;li&gt;A description, which is displayed to the user when being prompted to authorise the client. &lt;/li&gt;
&lt;li&gt;If it is a default scope, that is one that is automatically requested if a client doesn't request any scopes&lt;/li&gt;
&lt;li&gt;If it can't be disallowed, that is a user cannot refuse to give this scope to a client if it asks for it. &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The next step is to set up clients. This is also done in the CMS &lt;a href=&quot;http://yoursite.com/admin/oauth/oauth-model-Client&quot;&gt;here&lt;/a&gt;. Here, you can create and edit clients.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600405-client-edit-form.png&quot; width=&quot;600&quot; height=&quot;405&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;With each client you can set:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A name, description, logo and website that can be displayed to the user whenever the client gets displayed.&lt;/li&gt;
&lt;li&gt;A default endpoint that the user is redirected to in case the client does not supply a redirect URI with its request.&lt;/li&gt;
&lt;li&gt;A list of valid return URIs. At the most lenient, each of these must be a domain name; at the most strict, a full URI.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;After saving for the first time a client identifier is automatically generated. The client use this identifier and the return URIs when requesting access to a user.&lt;/p&gt;
&lt;p&gt;Once you've set up the scopes and clients, the only step left before your OAuth server is ready for use is to provide some endpoints for clients to actually call.&lt;/p&gt;
&lt;h3&gt;Setting up your controllers&lt;/h3&gt;
&lt;p&gt;Everything you need to require that either an entire Controller or just certain actions use OAuth is all done using the `RequireOAuth` extension.&lt;/p&gt;
&lt;p&gt;When adding the extension to your controller, you have three options depending on what you pass as arguments to the extension. The default option is to require OAuth for all requests to the controller without requiring any specific scope. This is achieved by simply adding the extension without any arguments:&lt;/p&gt;
&lt;pre&gt;&amp;lt;code type=&quot;php&quot;&amp;gt;&lt;br/&gt;public static $extensions = array(&lt;br/&gt;    'RequireOAuth',&lt;br/&gt;);&lt;br/&gt;&amp;lt;/code&amp;gt;&lt;/pre&gt;
&lt;p&gt;If you would like to allow general access to the controller, but still require OAuth for certain actions, pass it `false` as a single argument:&lt;/p&gt;
&lt;pre&gt;&amp;lt;code type=&quot;php&quot;&amp;gt;&lt;br/&gt;public static $extensions = array(&lt;br/&gt;    'RequireOAuth(false)',&lt;br/&gt;);&lt;br/&gt;&amp;lt;/code&amp;gt;&lt;/pre&gt;
&lt;p&gt;The third option is to only allow OAuth-authenticated requests with certain scopes. This is done by passing the required scopes as strings to the extension. For example, if you wanted to require the `read` and `write` scopes:&lt;/p&gt;
&lt;pre&gt;&amp;lt;code type=&quot;php&quot;&amp;gt;&lt;br/&gt;public static $extensions = array(&lt;br/&gt;    'RequireOAuth(&quot;read&quot;, &quot;write&quot;)',&lt;br/&gt;);&lt;br/&gt;&amp;lt;/code&amp;gt;&lt;/pre&gt;
&lt;p&gt;Using &lt;a href=&quot;http://doc.silverstripe.org/framework/en/3.1/topics/controller#access-control&quot;&gt;`$allowed_actions`&lt;/a&gt; it is possible to further restrict specific actions to requiring specific scopes using the `requireScopes` method made available through the extension and passing in the required scopes as strings. For example, if you wanted the method `delete` to require the `destroyer` scope, you'd have:&lt;/p&gt;
&lt;pre&gt;&amp;lt;code type=&quot;php&quot;&amp;gt;&lt;br/&gt;public static $allowed_actions = array(&lt;br/&gt;    'delete' =&amp;gt; '-&amp;gt;requireScopes(&quot;destroyer&quot;)',&lt;br/&gt;);&lt;br/&gt;&amp;lt;/code&amp;gt;&lt;/pre&gt;
&lt;p&gt;The final check the extension allows you to perform is a conditional check for a scope. This allows you to provide additional functionality inside actions if a scope is present. This is done by passing the scopes to check for to `hasScopes`. I.e.:&lt;/p&gt;
&lt;pre&gt;&amp;lt;code type=&quot;php&quot;&amp;gt;&lt;br/&gt;if($this-&amp;gt;hasScopes('read')) {&lt;br/&gt;    // you can read!&lt;br/&gt;}&lt;br/&gt;&amp;lt;/code&amp;gt;&lt;/pre&gt;
&lt;h3&gt;Client process&lt;/h3&gt;
&lt;p&gt;The only thing left to do now is let clients know how they talk to you. There are three parts to this. In the first, the client asks for permission to a user. They do this by sending the user to `https://yoursite.com/oauth/authorise?response_type=code&amp;amp;client_id=&amp;lt;identifier&amp;gt;&amp;amp;scope=&amp;lt;scope1&amp;gt;+&amp;lt;scope2&amp;gt;&amp;amp;redirect_uri=&amp;lt;uri&amp;gt;&amp;amp;state=&amp;lt;state&amp;gt;`. In this URL, `&amp;lt;identifier&amp;gt;` is the client identifier displayed in the CMS; `&amp;lt;scope1&amp;gt;` and `&amp;lt;scope2&amp;gt;` are scopes that the client would like; `&amp;lt;uri&amp;gt;` is the URI to return the user to once they either accept or reject the permission request; and `&amp;lt;state&amp;gt;` is an optional state parameter. These parameters can also be sent as POST parameters.&lt;/p&gt;
&lt;p&gt;The user is then asked if they want to give the client access to their account. If they don't give permission, then they are redirected to `&amp;lt;redirect_uri&amp;gt;?error=access_denied&amp;amp;state=&amp;lt;state&amp;gt;` to notify the client. Otherwise, the user grants permission and is redirected to `&amp;lt;redirect_uri&amp;gt;?code=&amp;lt;code&amp;gt;&amp;amp;state=&amp;lt;state&amp;gt;&amp;amp;scope=&amp;lt;scope1&amp;gt;+&amp;lt;scope2&amp;gt;` where `&amp;lt;code` is an authentication code; `&amp;lt;state&amp;gt;` is the state value passed in at the start of the request; and `&amp;lt;scope1&amp;gt;` and `&amp;lt;scope2&amp;gt;` are scopes that the client has been granted permission for.&lt;/p&gt;
&lt;p&gt;Now that the client has the authentication code the second step is to request an access token. This is done by sending a POST request to `https://yoursite.com/oauth/token` with the parameters `grant_type` with the value `authorization_code`, `code` with the authentication code received in the previous step and `redirect_uri` with the redirect uri provided in the previous step. Assuming everything goes well, a JSON object is returned to the client containing `access_token`, `scope` and `token_type` which contain the access token, the scopes the token has access to and the type of token (in a standard install, this will be Bearer) respectively.&lt;/p&gt;
&lt;p&gt;The third and final step is for the client to make authorised requests. This is done by making a request to one of the endpoints you set up early with the &quot;Authorization: Bearer &amp;lt;access_token&amp;gt;&quot; header.&lt;/p&gt;
&lt;p&gt;For more on this process, you can read the RFC for both &lt;a href=&quot;http://tools.ietf.org/html/rfc6749&quot;&gt;OAuth 2&lt;/a&gt; and &lt;a href=&quot;http://tools.ietf.org/html/rfc6750&quot;&gt;Bearer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You're now set up with an API that utilises OAuth for authentication that is ready for consumption by the world at large! As always, I'm available to answer further questions and can usually be found in the &lt;a href=&quot;http://www.silverstripe.org/irc-channel&quot;&gt;IRC Channel&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Wed, 20 Feb 2013 10:19:46 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/oauth-server/</guid>
		</item>
		
		<item>
			<title>Tackling project risk: How long is that piece of string?</title>
			<link>http://www.silverstripe.org/tackling-project-risk-how-long-is-that-piece-of-string/</link>
			<description>&lt;p&gt;&lt;em&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/diana-hennessy.png&quot; width=&quot;274&quot; height=&quot;182&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;As someone who is passionate about business, &lt;a href=&quot;http://www.silverstripe.com/about-us/team/project-management/diana-hennessy/&quot;&gt;Diana&lt;/a&gt; has a diverse background in many industries, most notably in a marketing or project management capacity. No matter which direction she went, she was always handed a website to  upgrade, create, design, or manage. She took this as a sign to head into  the web industry, and has since worked as a project manager combining  her knowledge of business and marketing to help clients achieve their  project vision.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’m going to start with a bold statement: Estimates are always wrong.&lt;/p&gt;
&lt;p&gt;Unless we are talking about a very small timeframe and only a few clearly defined deliverables, a technical project is almost never completed in the exact same number of hours/dollars as was originally estimated.&lt;/p&gt;
&lt;p&gt;It's not for lack of trying, or that someone has been grossly inaccurate on purpose. It's essentially just the nature of creation: a client doesn’t know exactly what they want, often until they see it.  Similarly, a vendor often doesn’t know exactly how they will deliver the requirements until they are elbow-deep in building it.&lt;/p&gt;
&lt;p&gt;I am lucky enough to have been both a client and a vendor on web projects. From a client's perspective, you need an idea of how much that big idea will cost, so you can make decisions about ROI, or compare vendors.  You also want to have a pretty good idea as to what you will have at the end of the project - will it meet the business requirements? No one likes to throw money at a vendor and hope for the best. You are accountable to internal streams and stakeholders - often many of them. The pressure to deliver quality and value as cost-effectively as possible is, in some cases, extreme. &lt;/p&gt;
&lt;p&gt;As a Project Manager, I have heard my clients say “heads will roll if we don’t deliver” or “my boss is expecting everything we talked about at the beginning”, more times than I can count.  I’m sure that these statements are true, but they create a very stressful situation for all involved.&lt;/p&gt;
&lt;p&gt;Having a vendor commit to fixed scope and budget gives a sense of security, however false. It gives you a contractual ‘big stick’ to protect yourself from overruns and ensures that you get what you pay for. All of this is perfectly understandable and reasonable. I get it. Clients often wonder why vendors push back on signing up for this. Fixed scope and fixed budget gives vendors no room to move, so why would they?&lt;/p&gt;
&lt;p&gt;Let's look at the other side of the coin.&lt;/p&gt;
&lt;p&gt;From a vendor’s perspective, when presented with scope from a client, they are actually being asked ‘how long is a piece of string?’.&lt;/p&gt;
&lt;p&gt;I have been involved in meetings that have gone like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client: &lt;/strong&gt;‘I want a website’&lt;strong&gt;&lt;br/&gt;Me: &lt;/strong&gt;‘Okay, what type of website are you thinking?’Client: ‘I dunno, maybe like YouTube, but better. That went well for them.’&lt;br/&gt;&lt;strong&gt;Me:&lt;/strong&gt; ‘Um, okay, YouTube was created and built over several years, and cost them many millions of dollars. Is that what you have budgeted?’&lt;br/&gt;&lt;strong&gt;Client:&lt;/strong&gt; ‘But I thought you guys were open source - surely you could do it for less than $50K?’&lt;/p&gt;
&lt;p&gt;I’m sure you get the idea. Without knowing how long some things can take to develop in reality, the expectations of client and vendor might not be just in different ballparks, but different states! The art of a good site is to make it look simple and easy. In reality, it may actually be hard, time consuming and expensive to get to that point.&lt;/p&gt;
&lt;p&gt;When my team look at a feature-set to estimate, many parameters are taken into account.&lt;/p&gt;
&lt;p&gt;First up, and most telling, is our experience. If we have built something similar before, we can make some pretty good assumptions.  If the business requirements are well defined, we can make even better assumptions. If it explains the acceptance criteria, or what ‘done’ looks like, even better. We think about how long we might think it would take us to complete, if it went well. Then, we ask ourselves how much longer would we need if everything hit the fan. Based on the risks around the feature at hand, we consider what would be the most likely scenario. This gives us a range of time or effort required to give the client that feature. We usually supply the assumptions and risks to the client to validate these are actually right. If the assumptions are incorrect, then it's back to the drawing board.&lt;/p&gt;
&lt;p&gt;So now the client has a range. And with that, a dollar value. This might be a small range, or it might be ±200%: it all depends on how much detail we have about the features required. For example, I can say to you right now, we can build you a website for somewhere between $15K and $2million. Of course, what you get in that website will vary wildly.&lt;/p&gt;
&lt;p&gt;If a client needs a more accurate estimate, then the detail needs to be more accurate. Even so, you can only go so far down that road - there will always be ambiguity in projects of any kind. I have watched as Business Analysts have written 150-page Functional Specifications for one feature of a site, thinking that this would give accuracy and clarity, and mean that changes won’t be required, only to have it fall over on day one, when some basic assumption is proven incorrect.&lt;/p&gt;
&lt;p&gt;We all need to agree on one thing: an estimate is a baseline to start a project, based on information and risks we understand on day one. On day two, it will change, and day 12, and day 50, with many other days in-between. As far as I know, no one can foretell the future, and as a big risk management person, the best you can do is:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Plan for the worst case,&lt;/li&gt;
&lt;li&gt;Hope for the best case,&lt;/li&gt;
&lt;li&gt;Identify where any change is likely to come from,&lt;/li&gt;
&lt;li&gt;Mitigate those actively as you traverse the project timeline,&lt;/li&gt;
&lt;li&gt;Be honest,&lt;/li&gt;
&lt;li&gt;Make good decisions based on all you can know at the time, and&lt;/li&gt;
&lt;li&gt;Have a contingency plan/budget for when the thing you didn’t know was coming hits you.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Be prepared to change everything. Always reassess what you have done to date, and whether what you plan to do next will still add the business value. If not, change the plan until it does. Accept that you don’t know what you don’t know, until you do. If a client and vendor can work openly and honestly with each other as a team, keeping an eye on the original goal, then you will have a successful delivery.&lt;/p&gt;
&lt;p&gt;Clients - cut vendors some slack. Estimates are always educated guesses, and the accuracy of that guess depends on you, and the experience of the team. &lt;/p&gt;
&lt;p&gt;Vendors - realise there is more at stake than just getting a project signed up. There are business outcomes and KPI’s relying on you to not screw this up, so be upfront, show them the potential worst case. It’s better than pretending it will all go swimmingly.  And then, at the end of the project, you can then tell them how long the piece of string was!&lt;/p&gt;</description>
			<pubDate>Thu, 14 Feb 2013 11:45:25 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/tackling-project-risk-how-long-is-that-piece-of-string/</guid>
		</item>
		
		<item>
			<title>SilverStripe selected to build Common Web Platform for New Zealand Public Sector</title>
			<link>http://www.silverstripe.org/silverstripe-selected-to-build-common-web-platform-for-new-zealand-public-sector/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage383255-wTcv9JtKRSDYZJ3I-JFSEmrLFpWvltm06xp9OFM3d7k.jpg&quot; width=&quot;383&quot; height=&quot;255&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;Today we are proud and excited to announce that we have been selected  by the Department of Internal Affairs to build the Common Web Platform  for the New Zealand public sector.&lt;/p&gt;
&lt;p&gt;To do this, we are building a &lt;em&gt;Platform as a Service&lt;/em&gt; version  of SilverStripe CMS targeted specifically at the needs of the New  Zealand public sector. We are working with Revera, making use of their &lt;em&gt;Government Infrastructure as a Service&lt;/em&gt;,  alongside the set of open source tools that provide the best  environment for creating and hosting SilverStripe websites. Development  of the platform is already underway.&lt;/p&gt;
&lt;p&gt;As well as being a great validation of our product, we see this as an  opportunity to help push the envelope in the way that the public sector  can make use of the web.&lt;/p&gt;
&lt;p&gt;For more information about the Common Web Platform, please visit the ICT &lt;a href=&quot;http://ict.govt.nz/programme/rethink-online/implementing-rethink-online/common-web-services/platform&quot;&gt;website&lt;/a&gt;. If you are from an eligible agency and are interested in making use of the Common Web Platform, please contact DIA directly.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href=&quot;http://silverstripe.com&quot;&gt;silverstripe.com&lt;/a&gt;. For more information, please visit the &lt;a href=&quot;http://www.silverstripe.com/press/media-releases/dia-selects-silverstripe-to-build-common-web-platform-for-new-zealand-public-sector/&quot;&gt;media release&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>
			<pubDate>Thu, 07 Feb 2013 15:43:44 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/silverstripe-selected-to-build-common-web-platform-for-new-zealand-public-sector/</guid>
		</item>
		
		<item>
			<title>Drupal Connector Module</title>
			<link>http://www.silverstripe.org/drupal-connector-module/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/Robert.jpg&quot; width=&quot;216&quot; height=&quot;144&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;em&gt;&lt;a href=&quot;http://www.silverstripe.com/about-us/team/development/robert-curry/&quot;&gt;Robert&lt;/a&gt; is a SilverStripe developer who cut his teeth on computer games, first hacking them together between classes at uni and then professionally at Sidhe Interactive, where he worked on games for the PlayStation2 and Xbox consoles. After leaving Sidhe to &quot;go indie&quot; and develop websites to raise capital, he found that he really enjoyed working with web technologies and decided to make a go of it. This is Robert's first time as guest writer and he is here to introduce us to his latest project: the Drupal connector module.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Drupal connector has finally arrived! With this module you’ll be able to embed or import content from a site running on Drupal 5+ into your SilverStripe 3 site.&lt;/p&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;A lot of clients that we at SilverStripe HQ hear from already have an existing site, and unless the site is particularly small, they’re understandably not too keen on transferring the content over manually! It can be a massive task, involving either a web manager doing days’ worth of copy-and-pasting or a developer trying to decipher database schemas and writing custom database queries to export and import the data. &lt;/p&gt;
&lt;p&gt;So the clever clogs over at &lt;a href=&quot;http://www.silverstripe.com/about-us/team/#australia&quot;&gt;SilverStripe Australia&lt;/a&gt; developed the &lt;a href=&quot;https://github.com/nyeholt/silverstripe-external-content&quot;&gt;External Content module&lt;/a&gt; that allows SilverStripe to connect to other content management systems and read the data in there. In an nutshell, the module allows you set up connections to any number of external sources and then either display that information in a page on the SilverStripe website or import it directly into the SilverStripe site as pages. If you’d like more information on this module, head to the &lt;a href=&quot;https://github.com/nyeholt/silverstripe-external-content&quot;&gt;GitHub page&lt;/a&gt; or this &lt;a href=&quot;http://ss2doc-v2.ernie.silverstripe.com/old/module:external-content-newconnector&quot;&gt;tutorial&lt;/a&gt; of how to create a new connector.&lt;/p&gt;
&lt;p&gt;One connector that was missing was one of the most requested; Drupal. Drupal is a major player in the CMS space and a lot of sites are running on it, so consequently we get a fair number of potential clients wanting to migrate their content off their Drupal website easily and cheaply.&lt;/p&gt;
&lt;h2&gt;Drupal&lt;/h2&gt;
&lt;p&gt;Drupal organises page content into Nodes which are roughly equivalent to SilverStripe’s SiteTree objects. There is one key difference however - Nodes contain no hierarchy information. They can be organised into a tree with one of two main methods, a taxonomy or a menu.&lt;/p&gt;
&lt;h3&gt;Taxonomy structure&lt;/h3&gt;
&lt;p&gt;A taxonomy is a list of tags that can be nested to form a hierarchy. If a Drupal site uses a taxonomy to form a menu, then each entry in the menu tree is created as as a tag in the taxonomy. Every Node is assigned to its parent tag and appears nested beneath it in the site structure. A simple taxonomy used for a menu is shown below:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/1_7.jpg&quot; width=&quot;600&quot; height=&quot;465&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;So as you can see, this looks very similar to SilverStripe’s tree. There is a slight distinction in that in SilverStripe every entry in the menu is a SiteTree (and therefore, is likely a page on the website), whereas in a Drupal taxonomy structure the non-leaf entries are just taxonomy terms. When viewing one of these “pages” on the site they will usually just list their child pages and no content.&lt;/p&gt;
&lt;h3&gt;Menu structure&lt;/h3&gt;
&lt;p&gt;A menu structure is much closer to the SilverStripe SiteTree model. Each Node can be placed into a menu, either as a top-level element or as a child of an existing element in the menu. There is still a separation between the menu item and the Node that is corresponds to, but that’s only an underlying code issue rather than a structural difference.&lt;/p&gt;
&lt;h2&gt;Walkthrough&lt;/h2&gt;
&lt;h3&gt;Setting up Drupal&lt;/h3&gt;
&lt;p&gt;Though there are a few hoops you’ve got to jump through to allow your Drupal site to receive connections from external sources, although it’s all fairly straightforward.&lt;/p&gt;
&lt;p&gt;First of all, you need to install and the enable the &lt;a href=&quot;http://drupal.org/node/109640/release&quot;&gt;Services module&lt;/a&gt;. This module will allow Drupal to provide web services via a variety of interfaces (such as XMLRPC, REST, etc).&lt;/p&gt;
&lt;p&gt;If you’re using 5.x you’ll need to specifically enable the Node, System Taxonomy and User services, so enable them in the Services module:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/2_4.jpg&quot; width=&quot;600&quot; height=&quot;431&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Lastly, enable the XMLRPC Server:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/4_2.jpg&quot; width=&quot;600&quot; height=&quot;163&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/3_2.jpg&quot; width=&quot;600&quot; height=&quot;146&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;If you’re using Drupal 5.x or 6.x, then you’ll also need to create an  API key. To do this, visit /build/services/keys. The domain can be  anything you like.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/5_2.jpg&quot; width=&quot;600&quot; height=&quot;255&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Unfortunately there is a constraint in 5.x and 6.x that caps the number of nodes per taxonomy item that can be returned by a feed, and this can’t be exceeded without modifying the module. However, we can still increase it as far as it can go - visit /admin/content/rss-publishing and adjust the “Number of items per feed”.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/6_2.jpg&quot; width=&quot;600&quot; height=&quot;263&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;If you are using Drupal 7.x, you also have the option to export by menus. To do this, you’ll need to install the &lt;a href=&quot;http://drupal.org/project/services_menu&quot;&gt;Services Menu module&lt;/a&gt; and then enable the menu service:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/7_2.jpg&quot; width=&quot;600&quot; height=&quot;222&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Also it’s worth noting that you should create a new user just for the connector to use. If you do so, make sure it has all the appropriate permissions to use the services (and services menu) module.&lt;/p&gt;
&lt;h3&gt;Setting up SilverStripe&lt;/h3&gt;
&lt;p&gt;To set up your SilverStripe site to import Drupal content, you’ll need to install the &lt;a href=&quot;https://github.com/nyeholt/silverstripe-external-content&quot;&gt;External Content module&lt;/a&gt; and the &lt;a href=&quot;https://github.com/silverstripe-droptables/silverstripe-drupal-connector&quot;&gt;Drupal Connector module&lt;/a&gt; and run a dev/build.&lt;/p&gt;
&lt;p&gt;This will add an “External Content” tab to the CMS. From within this tab you’ll be able to create two types of Drupal connectors - one for menus and one for taxonomies. They’re very similar, the only difference being that one requires the name of the menu and the other the id of the taxonomy.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/8.jpg&quot; width=&quot;600&quot; height=&quot;284&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;If you’ve entered everything necessary (including the API Key and Domain  for 5.x or 6.x), then you should see the tree of the menu/taxonomy  appearing in the left tree view:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/9.jpg&quot; width=&quot;600&quot; height=&quot;400&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;From here you can either import the data as it exists right now into SilverStripe pages (using the Import tab), or create an External Content Page and view the content on the site as it appears on the Drupal site - even if new pages are added.&lt;/p&gt;
&lt;h2&gt;Contribution and future&lt;/h2&gt;
&lt;p&gt;You can start using the connector right now - you just need SilverStripe 3.0+, the External Content module, the Drupal connector module, and a Drupal site!&lt;/p&gt;
&lt;p&gt;It’s still pretty rough right now - the importing process takes a long time and doesn’t provide any feedback, and it doesn’t pull any assets in with it. One of our internal teams will be doing a fair bit of work with this module in the coming months, too.&lt;/p&gt;</description>
			<pubDate>Wed, 30 Jan 2013 09:26:24 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/drupal-connector-module/</guid>
		</item>
		
		<item>
			<title>Get Mobile with SilverStripe: Our Workplace Challenge </title>
			<link>http://www.silverstripe.org/get-mobile-with-silverstripe-our-workplace-challenge-/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage413259-intro.png&quot; width=&quot;413&quot; height=&quot;259&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;Amidst the craziness of December 2012, we held an in-house mobile app competition at SilverStripe Headquarters, coined the &quot;Jedi Challenge&quot;. The topic for the Jedi  Challenge was to &lt;em&gt;interact on the move&lt;/em&gt;. The application needed  to be mobile and multi-user focussed. There were really no boundaries with this  competition, which saw a range of entries from a recipe app, to a real-time, multi-player game. Head over to ss.com for the &lt;a href=&quot;http://www.silverstripe.com/blog/get-mobile-with-silverstripe-the-jedi-challenge/&quot;&gt;full story&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Fri, 25 Jan 2013 12:34:22 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/get-mobile-with-silverstripe-our-workplace-challenge-/</guid>
		</item>
		
		<item>
			<title>Santa brought you 3.1.0 beta 1</title>
			<link>http://www.silverstripe.org/santa-brought-you-a-3.1.0-beta1/</link>
			<description>&lt;p class=&quot;c1 c2&quot;&gt;It’s been about six months since we released 3.0 stable into the world, and the whole team is proud to see it being adopted so well by the community at large. Since then, we've had over 500 &lt;a class=&quot;c6&quot; href=&quot;https://github.com/silverstripe/sapphire/pulls&quot;&gt;pull&lt;/a&gt; &lt;a class=&quot;c6&quot; href=&quot;https://github.com/silverstripe/silverstripe-cms/pulls&quot;&gt;requests&lt;/a&gt; to our core, mostly targeted at the new version, which is a fantastic result. &lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;Typically, you had to wait for at least a year to get to the next major stable version. In the spirit of continuous delivery, we want to shorten this time frame a bit, and provide you with slimmer, but more frequent releases. Accordingly, the 3.1.0 beta 1 release has a lot of incremental, but less visible improvements. With the release being in beta status, we don’t expect any further API changes, and encourage you to &lt;a class=&quot;c6&quot; href=&quot;http://www.silverstripe.org/pre-releases/&quot;&gt;download&lt;/a&gt; it and try the codebase (&lt;a class=&quot;c6&quot; href=&quot;http://doc.silverstripe.org/framework/en/3.1/changelogs/beta/3.1.0-beta1&quot;&gt;changelog&lt;/a&gt;, &lt;a class=&quot;c6&quot; href=&quot;http://doc.silverstripe.org/framework/en/3.1/changelogs/3.1.0&quot;&gt;upgrading guide&lt;/a&gt;).&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;Even after extensive peer review on early CMS designs on the community mailing list, our major focus is still on interface usability, and ensuring that we provide adequate feedback on user actions. In SilverStripe 3.0 (like in most CMSes), you had to switch between the editing interface and a preview of the actual website. In 3.1, you can see the two side-by-side, provided you have a decent screen resolution. There are new options for previewing at different widths, and more useful controls for switching between draft and live content.&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600216-ss31-screenshot1.png&quot; width=&quot;600&quot; height=&quot;216&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Image: Side-by-side view&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/ss31-screenshot2.png&quot; width=&quot;600&quot; height=&quot;176&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Image: Preview modes&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;Talking to many CMS users, we also found that they are commonly overwhelmed by the various buttons to affect a page, e.g. to save its content to draft. So we’ve moved the minor actions into a flyout, alongside some useful metadata about the page itself. There’s an API for that, so you can add your own minor actions as well. In addition, the CMS change detection now highlights if a page needs saving by changing the button style.&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/ss31-screenshot3.png&quot; width=&quot;600&quot; height=&quot;300&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;br/&gt;&lt;em&gt;Image: Grouped buttons&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;On the framework side, we’ve made some architectural changes to DataList and ArrayList, ensuring that they are consistently immutable, meaning they’ll always return copies rather than modifying themselves. This means that you can pass DataLists to other parts of your application without worrying that they will get modified, making code more modular and maintainable. We’ve removed a whole bunch of legacy APIs which were previously deprecated, most prominently the TableListField and ComplexTableField classes which are now replaced by the infinitely more awesome GridField class (there’s a &lt;a class=&quot;c6&quot; href=&quot;https://github.com/silverstripe-labs/legacytablefields&quot;&gt;legacy support module&lt;/a&gt; if you really can’t switch to GridField right now).&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;We’re also pleased to announce support for the &lt;a class=&quot;c6&quot; href=&quot;http://getcomposer.org&quot;&gt;Composer&lt;/a&gt; dependency manager, which makes installing a SilverStripe project as well as new modules much easier (see &lt;a class=&quot;c6&quot; href=&quot;http://doc.silverstripe.org/sapphire/en/installation/composer&quot;&gt;docs&lt;/a&gt;). Modules can define their own dependencies programmatically, which should make it effortless to create modular solutions and share nicely decoupled code between modules. Over 50 SilverStripe modules managed by Composer are already &lt;a class=&quot;c6&quot; href=&quot;https://packagist.org/search/?q=silverstripe&quot;&gt;listed&lt;/a&gt; on packagist.org, a common repository for PHP modules.&lt;/p&gt;
&lt;p class=&quot;c1&quot;&gt;To stay tuned and help out, keep an eye on our &lt;a class=&quot;c6&quot; href=&quot;http://open.silverstripe.org/milestone/3.1.0&quot;&gt;3.1.0 milestone&lt;/a&gt; in the bugtracker. And read through our &lt;a class=&quot;c6&quot; href=&quot;http://doc.silverstripe.org/framework/en/3.1/changelogs/beta/3.1.0-beta1&quot; target=&quot;_blank&quot;&gt;changelog overview&lt;/a&gt; to get a more detailed understanding of the release.&lt;/p&gt;</description>
			<pubDate>Tue, 18 Dec 2012 04:07:00 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/santa-brought-you-a-3.1.0-beta1/</guid>
		</item>
		
		<item>
			<title>Why BSD?</title>
			<link>http://www.silverstripe.org/why-bsd/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage338254-freedom-next-exit.jpg&quot; width=&quot;338&quot; height=&quot;254&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;Back in 2007, when we made the decision to open source our CMS, we were faced with a decision: which open source license should we release it under?  Although at first glance it may seem like a bit of tedious legal administration, the choice of license cuts to the heart of the goals of an open source project.&lt;/p&gt;
&lt;p&gt;There are many other licenses to choose from, such as GPL, BSD, MIT and Apache. MIT and BSD are very similar.  The Apache License has a similar permissive intent, but is more explicit, and as such it is a lengthier, more complex document. We didn't spend too much time choosing between very similar licenses and instead quickly narrowed our choice down to two alternatives: BSD and GPL.&lt;/p&gt;
&lt;p&gt;BSD is short for &lt;a href=&quot;http://en.wikipedia.org/wiki/Berkeley_Software_Distribution&quot;&gt;Berkeley Software Distribution&lt;/a&gt; and is the name of a Unix derivative.  The BSD license is so named because it was originally used as the license for this software.  GPL is short for GNU Public License, and was the license used by the GNU project, principally for the release of GNU/Linux. GNU/Linux is the operating system commonly known as Linux, the name GNU/Linux refers to the fact that, strictly speaking, Linux is just the kernel, and the GNU project developed many of the tools that turn that kernel into a usable operating system.&lt;/p&gt;
&lt;p&gt;For us, the critical difference between the two licenses was this:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Modifications to a GPL-licensed project must be contributed back to the open source product, and cannot be released solely under a non-GPL license.&lt;/li&gt;
&lt;li&gt;Modifications to a BSD-licensed project can be retained, and potentially sold commercially, by their creators.  Very few restrictions are placed on the so-called &quot;derivative works&quot;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;GPL presents an opportunity for commercial entities looking to release open source software, because the GPL won't be appropriate for some people and/or organisations.  The GPL also prevents other organisations from creating commercial variants of SilverStripe, reserving that right for the copyright holder.&lt;/p&gt;
&lt;p&gt;At the time we chose a license, SilverStripe already existed as a proprietary product, and GPL initially seemed like a safer choice.  However, ultimately we found GPL was out of step with our goals.&lt;/p&gt;
&lt;p&gt;Dual-licensing may seem appealing as an open source business model, until you work through the details of what this means for contributions.  If third party contributors retain copyright of their changes, then those contributions can't be included with any dual-licensed version of the software. This means you have to maintain two separate forks of the software.  If, instead, we asked contributors to assign copyright to SilverStripe for their contributions, they are effectively losing significant rights that they have in those changes, because only the copyright holder has rights to release the software under other licenses.  Sure, you could have contributor agreements that deal with this, but it makes contribution a complex legal issue, and will ultimately drive a wedge between the needs of the developer community and the needs of the commercial entity behind the software.  To us, dual-licensing was a non-starter.&lt;/p&gt;
&lt;p&gt;The second benefit we initially saw in GPL was that it protected us from other commercial entities that might create their own commercial variants.  In the end, we decided that this wasn't a major issue.  Yes, software takes effort to build and it is very useful, but ultimately, the lines of code that are protected by copyright law are not the most valuable asset of our business.  Much more valuable are the people that know how to keep innovating, and the reputation we have for doing so.  As such, although being protected from competition by copyright law would be nice, it isn't nearly as important as our team and reputation.  We decided that this was a risk we could take.&lt;/p&gt;
&lt;p&gt;There is a final benefit of GPL being that it tends to force software to become open source rather than proprietary.  For some, this is the point: all software should be open source (also called &quot;free software&quot;).  Although we at SilverStripe think that open source software is a great thing, and that it is definitely possible to build sucessful companies around open source software, we believe that &quot;all software should be free&quot; is too simplistic - it requires a one-size-fits-all view of the world that we don't share.  So this wasn't a benefit of the GPL that we found compelling.&lt;/p&gt;
&lt;p&gt;Which brings us to the BSD.  We believe that BSD is the open source license that best recognises that open source software will sometimes be worked on as a commnuity project, and sometimes be commercialised.  We have released SilverStripe open source, but we also run a business that aims to make money.  All that the BSD license really says is that we are okay with other people doing the same.  We think that anything less would be unfair.&lt;/p&gt;</description>
			<pubDate>Wed, 12 Dec 2012 18:53:53 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/why-bsd/</guid>
		</item>
		
		<item>
			<title>Closeup on Application Platform Liked</title>
			<link>http://www.silverstripe.org/closeup-on-application-platform-liked/</link>
			<description>&lt;p&gt;&lt;em&gt;The creators of &lt;a href=&quot;http://www.liked.com/&quot;&gt;liked.com&lt;/a&gt; consist of a team of six Swedish guys - entrepreneurs Marcus and Robert, developers Tomas, Eskil and Andreas, and a designer, Dawid, all located in Stockholm. They started to build the site one year ago during their spare time. &lt;/em&gt;&lt;em&gt;Tomas and Eskil have been working with SilverStripe for about four  years now within different companies and projects throughout Sweden. &lt;/em&gt;&lt;em&gt;After many late nights of hard coding and design work, the project has become quite the success. &lt;br/&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600326-Screen-shot-2012-12-03-at-1.26.26-PM.png&quot; width=&quot;600&quot; height=&quot;326&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Developers Eskil and Tomas (with the beard)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;You built the website liked.com. Tell us a bit about the website.&lt;/h3&gt;
&lt;p&gt;Liked is a search engine for Android and iPhone applications, on top of that we have added facebook connect so that you can create your own profile at Liked where you can add your favorite apps to what we call collections. You can also follow other Liked users, review and rate apps and comment collections.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600489-Screen-shot-2012-12-03-at-3.06.10-PM.png&quot; width=&quot;600&quot; height=&quot;489&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3/&gt;
&lt;h3&gt;Where did you find the inspiration to create Liked?&lt;/h3&gt;
&lt;p&gt;Marcus and Robert had an idea to build a social app search where you can connect with friends and share your app findings. They talked to Dawid who did a design of all pages that was needed. After this was done Eskil, Andrea and I started to build the first version of the site at nights after work and on the weekends.&lt;/p&gt;
&lt;h3&gt;How many users do you have and what’s the average number of downloads for a user per month?&lt;/h3&gt;
&lt;p&gt;The site is still in beta, so we have not started to promote it yet.&lt;/p&gt;
&lt;h3&gt;How much does it cost to download an app?&lt;/h3&gt;
&lt;p&gt;Downloading apps from Liked doesn't involve any additional cost, the price is the same as you get in app stores.&lt;/p&gt;
&lt;h3&gt;Why do you think people like liked.com?&lt;/h3&gt;
&lt;p&gt;We hope people will like the site because it will be an easier way to find new apps. The app stores of today are pretty hard to search in. We are also planning to give the developers more room to promote their apps. Also right now we are building a new version of the index page to give users a new way to search through all  the apps we have stored. This new “inspiration” mode is still under development and we cannot not tell you how it works or looks yet. You will just have to wait until it’s live!&lt;/p&gt;
&lt;h3&gt;How does your business model work? Can you live off what you make with this business?&lt;/h3&gt;
&lt;p&gt;As we are still in beta we cannot live off this business at the moment.&lt;/p&gt;
&lt;h3&gt;How many people do you have working from where and doing what?&lt;/h3&gt;
&lt;p&gt;All develpment on the site is done in Stocklholm. Mostly me (Tomas) and Eskil working with the backend. Dawid with design. Marcus and Robert with SEO etc.&lt;/p&gt;
&lt;h3&gt;You built this project with SilverStripe. What parts of the SilverStripe Suite did you use and why?&lt;/h3&gt;
&lt;p&gt;We are right now using SS 2.4 with the dbsession, news and facebookconnect module. We have created a view of the Applications tables in mysql that we index using Sphinx. We created our own Sphinx wrapper class to run the search queries against this index. Below is a basic example of how that works:&lt;/p&gt;
&lt;pre&gt;&lt;span id=&quot;internal-source-marker_0.4388675618275041&quot; style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;$searchresult = SearchEngine::query();&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;$appsresult = new DataObjectSet();&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;/* Populating dataobjectset with applications from sphinx result */&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;if($searchresult['total'] &amp;gt; 0) {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;    foreach ( $searchresult['matches'] as $result ){    &lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;    &lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;        $appsresult-&amp;gt;push( DataObject::get_by_id(&quot;Application&quot;, $result['id']) );&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;    }&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;} else {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;    $appsresult = false;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Since the site is running in a load balanced environment we use &lt;a href=&quot;https://github.com/silverstripe-labs/silverstripe-dbsession&quot;&gt;dbsessions&lt;/a&gt; to keep the session data consistent between the web servers.&lt;/p&gt;
&lt;p&gt;We are using the &lt;a href=&quot;http://www.silverstripe.org/facebook-connect-module/&quot;&gt;Facebook Connect module&lt;/a&gt; by &lt;a href=&quot;http://www.silverstripe.org/ForumMemberProfile/show/94&quot;&gt;Willr&lt;/a&gt; for an easy way to register with facebook connect and get the benefits from the sdk.&lt;/p&gt;
&lt;h3&gt;How did you customise the tool to make it work for you?&lt;/h3&gt;
&lt;p&gt;Because of the amount of Application pages (eg. &lt;a href=&quot;http://www.liked.com/ios/plague-inc/&quot;&gt;http://www.liked.com/ios/plague-inc/&lt;/a&gt;) that the site has, we are using DataObjects as Pages.&lt;/p&gt;
&lt;p&gt;We are also using Sphinx to index the data and in this way speed up the search results.&lt;/p&gt;
&lt;p&gt;Because of the total amount of screen dumps for all the apps that we list on the site is very large we needed a way to handle this. We didn’t want to download all the images and store them on our servers since this task would be very time cunsuming and it would take up a lot of resources and disk space.&lt;/p&gt;
&lt;p&gt;We decided to store the images in an Amazon S3 bucket and connected that bucket to Amazon CloudFront front for faster loading. The first time an image is requested we fetch the image from the original destination e.g. iTunes. Upload it to S3 and update our database to tag this image as stored. Below are some code snippets that illustrates the solution we came up with:&lt;/p&gt;
&lt;h4&gt;1. Template:&lt;/h4&gt;
&lt;pre&gt;&lt;em&gt;&lt;span id=&quot;internal-source-marker_0.4388675618275041&quot; style=&quot;font-size:13px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;&amp;lt;% control Application %&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-size:13px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;img src=&quot;$IconURL&quot; /&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;% end_control %&amp;gt;&lt;/span&gt;&lt;/em&gt;&lt;/pre&gt;
&lt;h4&gt;2. DataObject:&lt;/h4&gt;
&lt;pre&gt;&lt;span id=&quot;internal-source-marker_0.4388675618275041&quot; style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;public function getIconURL() {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    &lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    $icon = DataObject::get_one('Graphic', &quot;Type = 'Icon' AND ApplicationID =&quot; . $this-&amp;gt;ID );&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    &lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    if( ! $icon ) {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;        return '/themes/liked/images/no-img.png';&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    } else if( $icon-&amp;gt;onCdn == 'yes' ) {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;        return 'http://d30e0voobdlbps.cloudfront.net/' . $icon-&amp;gt;ID;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    } else {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;        return '/s3/' . $icon-&amp;gt;ID;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    }&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;h4&gt;3. htaccess:&lt;/h4&gt;
&lt;pre&gt;&lt;span id=&quot;internal-source-marker_0.4388675618275041&quot; style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;RewriteCond %{REQUEST_URI} ^/s3/(.*)$&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;RewriteRule .* s3.php?file=%1&amp;amp;%{QUERY_STRING} [L]&lt;/span&gt;&lt;/pre&gt;
&lt;h4&gt;4. s3.php&lt;/h4&gt;
&lt;pre&gt;&lt;span id=&quot;internal-source-marker_0.4388675618275041&quot; style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;$query = sprintf(&quot;SELECT MarketURL, onCdn FROM Graphic WHERE ID =%d&quot;,$id);&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span id=&quot;internal-source-marker_0.4388675618275041&quot; style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;curl_setopt ($ch, CURLOPT_URL, $url);&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;$img = curl_exec($ch);&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);&lt;/span&gt;&lt;br/&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span id=&quot;internal-source-marker_0.4388675618275041&quot; style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;$s3 = new AmazonS3();&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;$response = $s3-&amp;gt;create_object($bucket, $id, array(&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    'body' =&amp;gt; $img,&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    'contentType' =&amp;gt; $contentType,&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    'acl' =&amp;gt; AmazonS3::ACL_PUBLIC&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;));&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;if( $response-&amp;gt;isOK() ) {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    $query = sprintf(&quot;UPDATE Graphic SET onCdn = 'yes' WHERE ID =%d&quot;, $id);&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    $result = mysql_query($query,$link);&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    header(&quot;HTTP/1.1 301 Moved Permanently&quot;);&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    header(&quot;Location: http://d30e0voobdlbps.cloudfront.net/&quot;.$id);&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;} else {&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    header(&quot;HTTP/1.0 404 Not Found&quot;);&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;    echo &quot;s3 error&quot;;    &lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;font-size: 13px; font-family: Arial; color: #000000; background-color: transparent; font-weight: normal; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;h3&gt;Would you recommend SilverStripe to others? Why?&lt;/h3&gt;
&lt;p&gt;We would! It is a great MVC framework that keeps the code clean and easy to work with. The built in “Magic” saves time when coding. Eskil and I have started our own buisness &lt;a href=&quot;http://www.stokmedia.se/&quot;&gt;Stök Media AB&lt;/a&gt; (haven’t had the time to build our own site yet :-) ) where we develop a lot of sites in SilverStripe, too.&lt;/p&gt;
&lt;h3&gt;What do you think about SilverStripe 3.0?&lt;/h3&gt;
&lt;p&gt;We started working with it  a while ago and the ModelAdmin enhancements were stunning! GREAT JOB!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thank you for taking the time to answer my questions and goodluck with your project.&lt;/em&gt;&lt;span style=&quot;font-size:15px;font-family:Arial;color:#000000;background-color:transparent;font-weight:normal;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;&quot;&gt; &lt;br/&gt;&lt;/span&gt;&lt;/p&gt;</description>
			<pubDate>Mon, 03 Dec 2012 11:15:00 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/closeup-on-application-platform-liked/</guid>
		</item>
		
		<item>
			<title>SilverStripe Framework and CMS 3.0.3 now available</title>
			<link>http://www.silverstripe.org/silverstripe-framework-and-cms-3.0.3-now-available/</link>
			<description>&lt;p&gt;SilverStripe is pleased to announce the immediate release of SilverStripe Framework and CMS 3.0.3 stable.&lt;/p&gt;
&lt;p&gt;3.0.3 is the third release in the 3.0.x series, a series of releases based on the major 3.0 release aimed at fixing bugs, adding minor functional enhancements and addressing security issues that have been discovered since that release.&lt;/p&gt;
&lt;p&gt;We recommend all developers who are developing sites on any version of 3.0 upgrade to 3.0.3 at their earliest opportunity. Not only does it fix many minor issues, it also includes fixes for four recently discovered security issues. As with all 3.0.x releases, we have focused on fixing issues with only the smallest possible changes to UI elements and APIs, and it is drop in compatible with 3.0, making upgrading simple.&lt;/p&gt;
&lt;p&gt;This is likely to be the last significant release in this series, as internal focus is shifting to development of 3.1, where features with more significant UI or API changes are allowed.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.silverstripe.org//stable-download/&quot;&gt;Download 3.0.3&lt;/a&gt; and view what's new in the &lt;a href=&quot;http://doc.silverstripe.org/framework/en/3.0/changelogs/3.0.3&quot; target=&quot;_blank&quot;&gt;changelog&lt;/a&gt;, see the &lt;a href=&quot;http://open.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;bugs&lt;/a&gt; that have been fixed (and raise new ones). Or use the new &lt;a href=&quot;http://doc.silverstripe.org/framework/en/installation/composer&quot; target=&quot;_blank&quot;&gt;composer support&lt;/a&gt; to get started.&lt;/p&gt;</description>
			<pubDate>Mon, 26 Nov 2012 15:36:20 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/silverstripe-framework-and-cms-3.0.3-now-available/</guid>
		</item>
		
		<item>
			<title>Document Management System Module</title>
			<link>http://www.silverstripe.org/document-management-system-module/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/julian.jpg&quot; width=&quot;274&quot; height=&quot;182&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;I have the pleasure of introducing a new module that we created here at the SilverStripe HQ - The Document Management System (DMS) module. &lt;/p&gt;
&lt;h3&gt;&lt;span&gt;History&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;A few years ago, community member &lt;a href=&quot;http://www.leftandmain.com/&quot;&gt;Aaron Calino&lt;/a&gt; (UncleCheese) created the &lt;a href=&quot;http://www.leftandmain.com/silverstripe-modules/2010/08/23/dataobjectmanager/&quot;&gt;Data Object Manager&lt;/a&gt; module for SilverStripe 2. This module was packed with features that allowed users to manage DataObjects related to pages. However, as Aaron has stated in &lt;a href=&quot;http://www.silverstripe.org/data-model-questions/show/18988&quot;&gt;this forum post&lt;/a&gt;, the new &lt;a href=&quot;http://doc.silverstripe.org/framework/en/reference/grid-field&quot;&gt;GridField&lt;/a&gt; class in SilverStripe 3 does much of what Data Object Manager did in SS2, so he won't be making a version of Data Object Manager for SS3.&lt;/p&gt;
&lt;p&gt;We found ourselves needing something similar to the old Data Object Manager module in one of our recent SS3 projects. We took this opportunity to create a great new open source module, a module built in the same spirit as the Data Object Manager, built on SS3 from the ground up, and built to serve as the basis for sophisticated Document Management with SilverStripe now and in the future.&lt;/p&gt;
&lt;h3&gt;Design goals&lt;/h3&gt;
&lt;p&gt;We had several goals in mind when designing the DMS module:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Painless association of files with pages&lt;/li&gt;
&lt;li&gt;Simple, clear and reliable file storage system&lt;/li&gt;
&lt;li&gt;Extensible and customisable architecture&lt;/li&gt;
&lt;li&gt;Easy UI for uploading, replacing, and linking files&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The first item in the list needs some explanation. Traditionally, SilverStripe has a &quot;Files and Images&quot; section where you upload files, then add these files to your page when you need them. This has the advantage that you can easily reuse a single file on multiple pages. However, more often than not, you will only ever need a file uploaded to a single page, and having to separately upload the file into &quot;Files and Images&quot; unnecessarily complicates the process. Additionally, if you want to replace a file with a new version, finding the underlying file from a reference on a page can quickly become tedious.&lt;/p&gt;
&lt;p&gt;Our solution is to directly associate files with the pages, skipping the &quot;Files and Images&quot; section completely. We then polish the process for doing so to make it as smooth, reliable, and painless as possible.&lt;/p&gt;
&lt;p&gt;The files themselves are stored in a folder structure under a new &quot;dms-assets&quot; folder. We intentionally preserve the filename of each file (as opposed to hashing names) to make it easier to find your file again in case something goes wrong. We do, however, add the database ID number to each filename, so that the link to the database record is obvious and extremely fault-tolerant. We use a number of folders for the files, so that all the files don't just end up in one gigantic folder. You can configure how many files go into each folder to suit your deployment.&lt;/p&gt;
&lt;p&gt;In case you're wondering about the scaleability of the DMS module. We are currently using the DMS in production with tens of thousands of documents and it doesn't even break a sweat.&lt;/p&gt;
&lt;h3&gt;Feature walkthrough&lt;/h3&gt;
&lt;p&gt;Here is a walk-through of some features of the DMS module:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600495-dms-adding-documents.png&quot; alt=&quot;adding documents&quot; title=&quot;adding documents&quot; width=&quot;600&quot; height=&quot;495&quot;/&gt;&lt;/p&gt;
&lt;p&gt;When you first install the DMS module, every page in the CMS gets a new &quot;documents&quot; tab. On that tab you can click the &quot;Add Documents&quot; button, which takes you to the screen above.&lt;/p&gt;
&lt;p&gt;Uploading is really easy. You just drag and drop (in modern browsers), and/or select files with a dialog box. Immediately after you upload files, you get the opportunity to either edit each file's metadata, or just click &quot;Done&quot; to go back to the page you were on.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600273-dms-linking-documents.png&quot; alt=&quot;linking documents&quot; title=&quot;linking documents&quot; width=&quot;600&quot; height=&quot;273&quot;/&gt;You can also link documents from other pages. You do this either by typing in an autocomplete search field (referencing files by name and/or ID), or by clicking the &quot;Browser by page&quot; button to get a TreeDropDown view of the page structure. The linked document appears on the current page, as well as the page where it was originally uploaded.&lt;/p&gt;
&lt;p&gt;You can link any document in the DMS to any page. A document does not &quot;belong&quot; to a specific page. For example, if you upload a document to Page-A, then link it to Page-B, then delete the document from Page-A, the document will stay on Page-B, as if nothing had happened. Reference counting keeps track of everything.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage581600-dms-grid.png&quot; alt=&quot;dms grid&quot; title=&quot;dms grid&quot; width=&quot;581&quot; height=&quot;600&quot;/&gt;Here is the DMS grid (powered by the SS3 &lt;a href=&quot;http://doc.silverstripe.org/framework/en/reference/grid-field&quot;&gt;GridField&lt;/a&gt;). It allows you to do a quick download, go to the detailed edit view, and delete or unlink the current file (if a file is only attached to a single page, then you get a &quot;delete&quot; button; otherwise, if the same file is attached to multiple pages, you get an &quot;unlink&quot; button). You can filter/search the grid by clicking on the &quot;magnifying glass&quot; button in the top-right corner.&lt;/p&gt;
&lt;p&gt;You can also sort the list of files in the grid with drag-and-drop if you drop in this &lt;a href=&quot;https://github.com/silverstripe-big-o/SortableGridField&quot;&gt;SortableGridField module&lt;/a&gt;. Similarly, the &quot;Show all&quot; button on the footer appears if you install this &lt;a href=&quot;https://github.com/silverstripe-big-o/gridfieldpaginatorwithshowall&quot;&gt;GridFieldPaginator module&lt;/a&gt;. Both are nice demos for how you can easily extend the functionality of the DMS with add-on modules.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600600-dms-edit.png&quot; alt=&quot;dms edit&quot; title=&quot;dms edit&quot; width=&quot;600&quot; height=&quot;600&quot;/&gt;&lt;/p&gt;
&lt;p&gt;The Detailed Editor view gives you the ability to view and edit a document's metadata. The DMS also has embargo and expiry built into it. So you can schedule documents to appear or disappear at a specific date. You can replace a document using drag-and-drop. &quot;Find usage&quot; shows other pages where the current document has been linked. &quot;Find references&quot; shows you pages where the current document has been referenced in the HTML content (more on that later). Finally, &quot;Delete&quot; deletes the document from this page and all other pages where it is used, giving you a warning pop-up before proceeding.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage600316-dms-insert-link.png&quot; alt=&quot;dms edit&quot; title=&quot;dms edit&quot; width=&quot;600&quot; height=&quot;316&quot;/&gt;&lt;/p&gt;
&lt;p&gt;This feature of the DMS allows you to insert a link to a DMS document into the HTML content of a page. The DMS adds a new option to the CMS link editor. You can use the combined auto-complete-search/PageTree-browse view to find the document you want to link to and insert the link. Again, reference tracking keeps track of each link you add and allows you to view where each document is linked in the Detail View.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.silverstripe.org/assets/blog/_resampled/resizedimage502600-dms-front-end.png&quot; alt=&quot;dms front-end&quot; title=&quot;dms front-end&quot; width=&quot;502&quot; height=&quot;600&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Finally, there has to be a way to display the documents in the website front-end, right? Of course there is. That requires a small change to your Page.ss template. Just add &amp;lt;% include Documents %&amp;gt; to the template wherever you want the documents to appear. That will give you a document listing similar to the one in the screenshot above.&lt;/p&gt;
&lt;h3&gt;Start using the DMS and contribute&lt;/h3&gt;
&lt;p&gt;We hope you like the new DMS module. Please try it out. Like all of SilverStripe, it is open-sourced using a &lt;a href=&quot;http://www.silverstripe.org//bsd-license/&quot;&gt;BSD license&lt;/a&gt;. Click to &lt;a href=&quot;https://github.com/silverstripe-labs/silverstripe-dms&quot;&gt;download the Document Management System module&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are keen to hear your feedback. If you have an idea for improving the module, please discuss it in the forum, or send us a &lt;a href=&quot;https://help.github.com/articles/using-pull-requests&quot;&gt;github pull-request&lt;/a&gt;. Here are some ideas we have thought of already:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;You can add a search box to your site that searches through the full-text of all documents using the &lt;a href=&quot;https://github.com/silverstripe-big-o/silverstripe-fulltextsearch&quot;&gt;fulltext-search module&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We are currently working on a simple method of versioning the files in the DMS. So, if you replace a document, the previous versions of that document are kept for archival purposes. This is coming soon.&lt;/li&gt;
&lt;li&gt;A new feature we are thinking about adding is a view that shows you all the documents in the DMS in a single view, a view you can use to conveniently search and edit all documents in the system. However, it might take a while until we get to doing this.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Wed, 21 Nov 2012 15:06:27 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/document-management-system-module/</guid>
		</item>
		
		<item>
			<title>Seeking support in SilverStripe&#39;s social sphere</title>
			<link>http://www.silverstripe.org/seeking-support-in-silverstripes-social-sphere/</link>
			<description>&lt;p&gt;&lt;em&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/1_4.png&quot; width=&quot;300&quot; height=&quot;286&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;I am a developer who uses the SilverStripe CMS. I have over four years experience in  everything from small websites to large multi-user internal system  tools. I was originally drawn to SilverStripe in my web developer  infancy because of its strong and intuitive templating system, and I've  never looked back. I give back to the community by providing support on  the IRC channel, through which I've met new people and learnt a whole  heap of things I never would have without the tools I'm about to talk  about below.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;So. You're a developer who has (perhaps recently) discovered  SilverStripe. That is great! You're loving how easy its sleek UI and  extremely supportive framework makes your life when it comes to  developing websites or web applications. However you've just come across  an issue that you're having trouble solving. Maybe it's a question  about how something works, what the best way to achieve something might  be, or maybe how to troubleshoot a problem you're having with the  system. Perhaps you just want to say &quot;Hi&quot; to the community. Whatever  your reasons, SilverStripe has a variety of methods to enable you to  contact people who are willing to offer you support.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Support can be found in abundance through the (soon to be upgraded for extra awesome) &lt;a href=&quot;http://silverstripe.org/&quot; target=&quot;_blank&quot;&gt;silverstripe.org&lt;/a&gt; (not .com, that's the company, not the community) website. First things  first, one should make sure to have at least read through the &lt;a href=&quot;http://doc.silverstripe.org/tutorials&quot; target=&quot;_blank&quot;&gt; tutorials&lt;/a&gt;.  Of these, the first two are most important, they will provide a basic  background to the entire system. Beyond that, tutorial 3 can help solve  many questions about forms, and tutorial 5 can be useful if you're new  to creating relations. Even as an experienced developer I still find  myself using tutorials 2 and 3 as quick references for things I cannot  be bothered to look up properly.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Beyond the &lt;strong&gt;tutorials&lt;/strong&gt; (that everyone should  read), it depends on your level of expertise as to where you should look  for help. Two of the most common reference sites are the &lt;strong&gt;docs&lt;/strong&gt; and the &lt;strong&gt;API&lt;/strong&gt;. The &lt;a href=&quot;http://doc.silverstripe.org&quot; target=&quot;_blank&quot;&gt;doc site&lt;/a&gt; holds many references and little tidbits of juicy info to give you  start-out help with whatever you have in mind to work your problem  through. This includes debugging help for issues that don't involve  building something with PHP (or the unfortunate aftermath of having  built something with PHP in the SilverStripe Framework). For the more  advanced PHP user, there is a full API documentation available at &lt;a href=&quot;http://api.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;api.silverstripe.org&lt;/a&gt;.  This is my most common port of call and holds many quick reference  notes for figuring out which method to use where, what is available in  your current scope, or even just checking up on the correct syntax or  method signatures to be used when coding your next function or subclass.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;These resources are all well and good, but what if  you're not a hardcore coder and need a little assistance in deciphering  what they're trying to tell you? &lt;a href=&quot;http://SilverStripe.org&quot; target=&quot;_blank&quot;&gt;SilverStripe.org&lt;/a&gt; also has facilities in place for a more personal level of support (by  personal I refer to getting answers from real people - not one on one full  system tutorage/getting your work done for you for free, an unfortunate  however surprisingly common mistake some people seem to make).&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;To this end there are the &lt;a href=&quot;http://www.silverstripe.org/forums/&quot;&gt;&lt;strong&gt;forums&lt;/strong&gt;&lt;/a&gt; and the &lt;strong&gt;&lt;a href=&quot;http://www.silverstripe.org/irc-channel&quot;&gt;&lt;strong&gt;IRC&lt;/strong&gt; &lt;strong&gt;channel&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt; available for personal contact with other developers using  their favourite system around the world. The forums are a useful place  for many beginners and contains a backlog of resources regarding  installation issues, module setup and problems, and fixes to those  problems. The issue here currently is that many of the more experienced  developers find the forums a little too simplistic for the more power  user style questions they wish to ask, or perhaps you're under too much  pressure to wait for an answer on the forums.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;For real time interaction, enter the &lt;a href=&quot;http://irc.silverstripe.org&quot; target=&quot;_blank&quot;&gt;IRC channel&lt;/a&gt;!  Here you will find an active community of developers, usually from  countries on your side of the planet (time zones are an interesting  thing like that), all at various levels of experience with SilverStripe  and more importantly, the Framework. These power users are there to  bounce ideas off of and query for instant help. And as an extra bonus,  most of the correspondence (both on and, err... &lt;em&gt;extremely&lt;/em&gt;, off topic) gets logged for future reference at &lt;a href=&quot;http://logs.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;logs.silverstripe.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;With the handy backlog of questions at &lt;a href=&quot;http://logs.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;logs.silverstripe.org&lt;/a&gt; you can perform a search by using the Google query &quot;&amp;lt;your question&amp;gt; site:&lt;a href=&quot;http://logs.simon.geek.nz/&quot; target=&quot;_blank&quot;&gt;logs.simon.geek.nz&lt;/a&gt;&quot;  (the logs are provided by prominent community member Simon Welsh on his  server). So asking questions also helps other people in the future who  may have the same problem as you. If you don't get a reply to your  question immediately, please don't feel left out. Many of the people in  the channel simply idle there and answer questions when they can at a  later time. This is why if you're on the IRC channel it is very  important to actually ask a question! Many times people arrive and ask  &quot;Can I ask a question?&quot; - to which there is no response before they  quit. If they were to actually ask their question they could search  through the logs at a later point to see if someone answered them after  they left. Everyone in the channel is there to help others, so ask away!&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;Recap:&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;&lt;ol&gt;&lt;li&gt;
&lt;p&gt;Read the tutorials. &lt;a href=&quot;http://doc.silverstripe.org/framework/en/tutorials/&quot; target=&quot;_blank&quot;&gt;http://doc.silverstripe.org/framework/en/tutorials/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for examples and references on &lt;a href=&quot;http://docs.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;docs.silverstripe.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power users can make great use of &lt;a href=&quot;http://api.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;api.silverstripe.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introductory personal help can be found at &lt;a href=&quot;http://silverstripe.org/forums&quot; target=&quot;_blank&quot;&gt;silverstripe.org/forums&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Community provided live support at &lt;a href=&quot;http://irc.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;irc.silverstripe.org&lt;/a&gt; (or your favourite IRC client - #silverstripe on Freenode)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search the IRC logs - &lt;a href=&quot;http://logs.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;logs.silverstripe.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The trac bugtracker at &lt;a href=&quot;http://open.silverstripe.org/&quot; target=&quot;_blank&quot;&gt;open.silverstripe.org&lt;/a&gt; sometimes lists untested/uncommitted patches to known problems in the ticket's comments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Bonus: Worth mention of course is &lt;a href=&quot;https://github.com/silverstripe&quot; target=&quot;_blank&quot;&gt;Github&lt;/a&gt; and Google - these two resources are ever handy for module readmes and &lt;a href=&quot;http://deadlytechnology.com/silverstripe&quot; target=&quot;_blank&quot;&gt;personal blogs&lt;/a&gt; about SilverStripe troubleshooting respectively.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;This is just a quick cap of the major resources  provided for one to find help about the SilverStripe CMS and Framework,  far from exhaustive. Also worth noting is the core developer mailing  list found on Google Groups: &lt;a href=&quot;http://groups.google.com/group/silverstripe-dev&quot; target=&quot;_blank&quot;&gt;groups.google.com/group/silverstripe-dev&lt;/a&gt; - If you wish to join in and contribute to or voice concerns about the  direction SilverStripe is taking as it progresses as a system worthy of  web dominance (or just lurk for bleeding edge news scoops). At every  turn there are friendly people willing to help you solve whatever issue  you're having with your SilverStripe system; all you have to do is find  out on which of the many available mediums you wish to put your  question, and then ask!&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;&lt;strong&gt;Please remember&lt;/strong&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;With these more  interactive ports of call for help, (as with any online community  interaction) a little bit of etiquette goes a long way. One must  remember that this help is offered by the community in their free time,  so basic courtesy goes a long way.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Please do not start off asking a  question by ranting about how bad the system design is just because it's  so different to whatever system you've used before. All you're likely  to receive is a disgruntled &quot;don't use it then&quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We're all here  because of our favourite system, and trying to aggressively convince a  whole community that they're wrong is a sure way to get ignored. If you  do have a criticisim, pose the question in a more approachable tone and you're far  more likely to get listened to and have your opinion considered  seriously.&lt;/p&gt;
&lt;/div&gt;</description>
			<pubDate>Thu, 15 Nov 2012 16:17:27 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/seeking-support-in-silverstripes-social-sphere/</guid>
		</item>
		
		<item>
			<title>The Dashboard Module: Make a splash in SilverStripe 3</title>
			<link>http://www.silverstripe.org/the-dashboard-module-make-a-splash-in-silverstripe-3/</link>
			<description>&lt;p&gt;&lt;em&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage137201-IMG02102.jpg&quot; width=&quot;137&quot; height=&quot;201&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;This month, we welcomed the newest member in a long line of &lt;a href=&quot;https://github.com/unclecheese&quot;&gt;Uncle Cheese&lt;/a&gt;’s brainchildren – the Dashboard module. Dashboard is for SilverStripe 3 only, and with a highly extensible API and frictionless interface, it’s likely that you’ll find more than a few reasons to use it on your next SilverStripe project.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Why Dashboard?&lt;/h3&gt;
&lt;p&gt;One of the disadvantages of being a developer is that we rarely get to play the role of an end-user in the software we create. When clients and project managers ask me what I love so much about SilverStripe 3, I usually rattle off a bunch of technical things – the new ORM, the improved templating, the GridField API – things that mean nothing to a content editor.  What most upgrade-fearing users are wondering is how SilverStripe 3 makes content editing easier, faster, and more powerful than ever before.&lt;/p&gt;
&lt;p&gt;There’s no doubt that SilverStripe 3 does all of those things. That much is clear from the feedback I get when showing the product to end-users. There is, however, one criticism common to both SilverStripe 2 and 3 that I hear too often to ignore – the lack of an action-oriented splash screen (read: &lt;a href=&quot;http://www.leftandmain.com/silverstripe-screencasts/2012/10/03/dashboard-module-for-silverstripe-3/&quot;&gt;dashboard&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In typical end-user fashion, they don’t come right out and ask for a “dashboard.” Most of them are not familiar enough with the lexicon to describe the idea with such precision. Rather, I hear a lot of desire for features that only a dashboard could offer.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;“How do I get back to the page I was working on yesterday?”&lt;/li&gt;
&lt;li&gt;“Where is the button to write a new blog?”&lt;/li&gt;
&lt;li&gt;“How do I get to the calendar?”&lt;/li&gt;
&lt;li&gt;“Where can I see how many people signed up for the seminar today?”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;All of these user stories send them on a journey of multiple clicks through trees and tables to find what they are looking for. A dashboard view would bring these actions to the surface, and offer a single-click, intuitive, user-biased path to a CMS action.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600265-Image1_2.png&quot; width=&quot;600&quot; height=&quot;265&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;h3&gt;So Why &lt;em&gt;Not&lt;/em&gt; Dashboard?&lt;/h3&gt;
&lt;p&gt;If the feature is of such high value, then why isn’t it already part of SilverStripe? To me, it makes a lot of sense to leave it out. SilverStripe is not a single-purpose application like WordPress or Magento. In fact, out of the box, it’s hardly an application at all. Until a developer builds something with the robust set of tools it offers, there’s not much you can say about what the needs of an end-user will be for a SilverStripe web site. Offering a pre-cooked dashboard risks capturing only a small number of common needs and leaving many more underserved.&lt;/p&gt;
&lt;h3&gt;An Open Solution&lt;/h3&gt;
&lt;p&gt;When I started building the Dashboard module, I knew the last thing I wanted was to offer a handful of static widgets that may or may not serve each user’s needs. Rather, like the SilverStripe platform itself, it should offer just enough out of the box, and invite developers to create custom solutions. Knowing that every developer understood the basic design pattern of creating a custom page type, I followed that template and offered an API that gave dashboard panels their own model, view, and controller. This means that each dashboard panel is self-contained and can render virtually anywhere, with any content you want it to.&lt;/p&gt;
&lt;h3&gt;How It Works&lt;/h3&gt;
&lt;p&gt;When you install Dashboard, the first difference you’ll see right away is that the “Dashboard” menu item is first in the list, usurping the Pages tab as the default view in the CMS. The dashboard is empty by default.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/_resampled/resizedimage600186-Image2.png&quot; width=&quot;600&quot; height=&quot;186&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;By clicking “New Panel,” you are offered a choice of several different panel types that come baked into the Dashboard module.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/Image3.png&quot; width=&quot;548&quot; height=&quot;352&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;They include:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Recent Edits:&lt;/strong&gt; Shows a list of recently edited pages, with links to edit each.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recent Uploads:&lt;/strong&gt; Show a list of recently uploaded files, with links to edit each.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick Links:&lt;/strong&gt; Builds a panel of arbitrary links, either internal (in the CMS) or external (on the web).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Analytics:&lt;/strong&gt; Shows the Google Analytics data for your entire site or a specific page on the site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Section Editor:&lt;/strong&gt; Shows a given section of the site, e.g. “blog” or “calendar”, displaying all of its child pages and offers links to create a new page or view all pages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ModelAdmin Editor:&lt;/strong&gt; Shows the list of a given ModelAdmin view and offers links to edit each record, view all, or create a new entry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GridField Editor: &lt;/strong&gt;Shows a GridField of a given page and allows direct linking to create and edit on the grid.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSS Feed:&lt;/strong&gt; Show an RSS feed from any public URL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weather:&lt;/strong&gt; Shows the current weather of a given city&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;After choosing the panel type you want to create, the panel is installed on your dashboard. If it needs immediate configuration, it will flip over automatically. Otherwise, you can click on the gear button to enter this view.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/Image4.png&quot; width=&quot;524&quot; height=&quot;343&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;On the back of the panel, you will find all of the metadata that defines how the panel looks and behaves. All panels have settings for their title and width.&lt;/p&gt;
&lt;h3&gt;Creating Default Dashboards&lt;/h3&gt;
&lt;p&gt;As a developer, you may want to offer each client a default dashboard so that users aren’t logging in to a buzz-killing blank page. You can apply a default dashboard in two different ways:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.	Retroactively:&lt;/strong&gt; Apply this dashboard to all existing users, overwriting whatever dashboard configurations they may or may not have presently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.	Proactively:&lt;/strong&gt; In the future, all new users receive this dashboard configuration by default.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/Image5.png&quot; width=&quot;289&quot; height=&quot;137&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;If you want to exert even more control over your users’ dashboards, the Dashboard module also offers a granular assortment of permissions, allowing you to specify which users can create, edit, sort, delete, and administer dashboard panels. By revoking all privileges, you can essentially give users a static, immutable dashboard view.&lt;/p&gt;
&lt;h3&gt;Creating Your Own Flavor&lt;/h3&gt;
&lt;p&gt;As mentioned earlier, one of the primary goals of the Dashboard module was to make it easy to extend and inviting for developers. There are only a few simple steps.&lt;/p&gt;
&lt;p&gt;1.	Create a subclass of DashboardPanel, e.g. “MyDashboardPanel.php”&lt;/p&gt;
&lt;p&gt;2.	Populate the &lt;em&gt;$db &lt;/em&gt;array with any custom fields used to configure the panel, e.g. “NumberOfRecords”&lt;/p&gt;
&lt;p&gt;3.	Create a &lt;em&gt;getConfiguration() &lt;/em&gt;function that returns a FieldList to for the edit form. This works just like &lt;em&gt;getCMSFields()&lt;/em&gt; on a page type. Remember to call &lt;em&gt;parent::getConfiguration()!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;4.	Create a template of the same name as your panel, e.g. “MyDashboardPanel.ss”&lt;/p&gt;
&lt;p&gt;5.	Create the view using any template accessors you have defined in your model, e.g. &lt;em&gt;&amp;lt;% loop MyRecords %&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;6.	Include any JavaScript or CSS dependencies in the &lt;em&gt;PanelHolder() &lt;/em&gt;method. Don’t forget to return &lt;em&gt;parent::PanelHolder()!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There’s a lot more you can do when building a custom dashboard panel. The module is full of great APIs to help you create exactly what you want.&lt;/p&gt;
&lt;h3&gt;Data Visualization&lt;/h3&gt;
&lt;p&gt;The Dashboard module comes with a charting API, albeit fairly primitive. Using the Google visualization JavaScript API, it allows you to create charts for dashboard panels that display arbitrary data over a given span of time. Just add data in X/Y pairs, and return the chart to your template.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.silverstripe.org/assets/Image6.png&quot; width=&quot;509&quot; height=&quot;338&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More Information&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Download it &lt;a href=&quot;http://www.github.com/unclecheese/silverstripe-dashboard&quot;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read the &lt;a href=&quot;https://github.com/unclecheese/silverstripe-dashboard/blob/master/README.md&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href=&quot;http://www.leftandmain.com/silverstripe-screencasts/2012/10/03/dashboard-module-for-silverstripe-3/&quot;&gt;screencasts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
			<pubDate>Thu, 08 Nov 2012 11:34:51 +1300</pubDate>
			
			
			<guid>http://www.silverstripe.org/the-dashboard-module-make-a-splash-in-silverstripe-3/</guid>
		</item>
		

	</channel>
</rss>