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

<channel>
	<title>Robert Speer Web Development &#187; Symfony</title>
	<atom:link href="http://www.robertspeer.com/blog/category/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.robertspeer.com/blog</link>
	<description>Symfony,  PHP, Wordpress, Business Analysis</description>
	<lastBuildDate>Wed, 26 May 2010 14:50:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Apostrophe: An outstanding Symfony CMS with no backend</title>
		<link>http://www.robertspeer.com/blog/apostrophenow-a-cms-so-easy-even-your-mom-could-use-it/</link>
		<comments>http://www.robertspeer.com/blog/apostrophenow-a-cms-so-easy-even-your-mom-could-use-it/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 17:43:14 +0000</pubDate>
		<dc:creator>Robert Speer</dc:creator>
				<category><![CDATA[ApostropheNow]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=94</guid>
		<description><![CDATA[ApostropheNow is the easiest to use OS content management system with an outstanding ROI, and it's build on the outstanding Symfony framework.]]></description>
			<content:encoded><![CDATA[<h3>Why do I care and where is the  demo:</h3>
<p><strong>Live demo</strong></p>
<p style="padding-left: 30px;"><strong><span style="font-weight: normal;">Link:<a href=" http://bit.ly/An_live_demo" target="_blank"> http://bit.ly/An_live_demo<br />
</a>Username: admin<br />
Password: demo<br />
<em>* login info is prepopulated in the login form so you can just press the login button<br />
** The database and media are  reset at the top each hour.</em></span></strong></p>
<p><strong>Why you care</strong></p>
<ul>
<li>The <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> CMS is easier to use, and easier to write templates for than <a href="http://wordpress.org/" target="_blank">WordPress</a>, <a href="http://drupal.org/" target="_blank">Drupal</a>, or <a href="http://www.joomla.com" target="_blank">Joomla</a>.</li>
<li>It&#8217;s well integrated into the enterprise ready <a href="http://www.symfony-project.org/" target="_blank">Symfony</a> framework.</li>
<li><a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> still allows developers to use almost all the features built into <a href="http://www.symfony-project.org/" target="_blank">Symfony</a> as well as the <a href="http://framework.zend.com" target="_blank">Zend Framework</a>.</li>
<li>Expensive features are baked in like:
<ul>
<li><a href="http://trac.apostrophenow.org/wiki/ManualEditorsGuide#RevisingHistory" target="_blank">Content version control</a></li>
<li><a href="http://trac.apostrophenow.org/wiki/ManualDevelopersGuide#Internationalization" target="_blank">Multiple language support or Internationalization</a></li>
<li><a href="http://trac.apostrophenow.org/wiki/ManualEditorsGuide#EditingMedia" target="_blank">Media library for images, videos, &amp; PDFs</a></li>
<li><a href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin" target="_blank">User management with permissions and groups</a></li>
</ul>
</li>
<li>It&#8217;s open source and easy to customize so it&#8217;s ROI is outstanding</li>
</ul>
<p><span id="more-94"></span></p>
<h3>How is this going to make me money?</h3>
<p><a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> is the easiest to use <a href="http://en.wikipedia.org/wiki/Content_management_system" target="_blank">content management system (CMS)</a> available to the open source community.  An easy CMS means that content managers are more likely to use it, which means consumers will get better information and be more likely to follow the sites profit funnel.</p>
<p>For web solutions providers <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> is a CMS solution that bypasses the <a href="http://www.ftpress.com/articles/article.aspx?p=777370" target="_blank">commodity hell</a> of <a href="http://wordpress.org/" target="_blank">WordPress</a>, <a href="http://drupal.org/" target="_blank">Drupal</a>, and <a href="http://www.joomla.com" target="_blank">Joomla</a> by providing a unique value differentiation.  <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> also has the advantage of being built on an enterprise grade web framework used by sites like <a href="http://www.symfony-project.org/blog/2007/10/02/delicious-preview-built-with-symfony" target="_blank">Delicious</a>, <a href="http://www.symfony-project.org/blog/2009/02/18/dailymotion-powered-by-symfony" target="_blank">Dailymotion</a>, <a href="http://www.symfony-project.org/blog/2008/05/08/yahoo-answers-powered-by-symfony" target="_blank">Yahoo! Answers</a>, and <a href="http://www.symfony-project.org/blog/2006/10/28/yahoo-bookmarks-uses-symfony" target="_blank">Yahoo! Bookmarks</a>.  <a href="http://www.symfony-project.org/" target="_blank">Symfony</a> provides a consistent structure that encourages collaboration, and the <a href="http://symfonians.net/people" target="_blank">large community of developers</a> already familiar with <a href="http://www.symfony-project.org/" target="_blank">Symfony</a> mean help is available.</p>
<h3>So what makes Apostrophe so special?</h3>
<p>Contextual content management is what.  Traditional content management systems have a backend admin interface that users log into to maintain the site.  The editing interface has nothing to do with the interface the content will be viewed on. Admin interfaces are also full of features that don&#8217;t make a lot of sense to someone not working with web technology every day.  Contextual content management mitigates these issues by allowing content to be edited in the same place the content is consumed.   To manage menus content editors simply drag and drop menu items where they need to go.   Content editors can add and edit content in multiple formats: rich text with a <a href="http://en.wikipedia.org/wiki/WYSIWYG" target="_blank">WYSIWYG</a>, plain text, <a href="http://en.wikipedia.org/wiki/RSS" target="_blank">RSS feed</a>, image, slideshow, button, video, pdf, or raw html.  These content formats are called <a href="http://trac.apostrophenow.org/wiki/ManualEditorsGuide#EditingSlots" target="_blank">slots</a> and are highly configurable in the templates during development.  <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> allows developers to control where <a href="http://trac.apostrophenow.org/wiki/ManualEditorsGuide#EditingSlots" target="_blank">slots</a> are available   as well as modify there behavior.  Developers can <a href="http://trac.apostrophenow.org/wiki/ManualDesignersGuide#SlotVariants:MoreMileageFromYourTemplates" target="_blank">add options</a> for users to choose from, for example the dev team can specify image sizes of small, medium, and large that content editors can choose from when they add an image slot.  Media files are managed through a built in media repository with categories, tagging, filtering by type, and text search.  A unique feature of all the <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> admin interfaces is that they use the same stylesheet as the rest of the site so they are visually integrated with the rest of the site.</p>
<h3>What if someone makes a mistake?</h3>
<p><a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> comes with content version control baked into contextual editing interface.  At the top of each content area, Area is <a href="http://www.apostrophenow.com/">Apostrophe</a> jargon, is a <a href="http://trac.apostrophenow.org/wiki/ManualEditorsGuide#RevisingHistory" target="_blank">History</a> button.  Click that and a dialog comes up showing who did what, and when, as well as allowing content editors to click on a revision to quickly review it.  To revert to that version simply click the new “Save As Current Revision”.   I&#8217;ve build content version control, and the user interface has been a problem for me, I never had the budget to do one right, but <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> nails it for free.</p>
<h3>How are multiple languages supported?</h3>
<p><a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> uses <a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/en/19" target="_blank">Symfony&#8217;s Multi-Lingual architecture</a>.  To add or edit a translation a developer needs to add a language switcher to tell <a href="http://www.symfony-project.org/" target="_blank">Symfony</a> what language is being requested.  Then the content editor can switch languages and make the translation just like if the site were a single language.  A key benefit of contextual content management is that the translator can see how the size of the translation is effecting the page&#8217;s layout.</p>
<h3>What about user management?</h3>
<p>The very popular <a href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin" target="_blank">sfDoctrineGuardPlugin</a> is utilized to provide user management features like: login, logout, a user <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a>, groups, and permissions. The<a href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin" target="_blank"> sfDoctrineGuardPlugin</a> is well tested, widely used and actively maintained.  <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> does a very nice job of integrating the plugin into the CMS and it automaticly adopts the design of the rest of the site.</p>
<h3>What kind of problems can I expect?</h3>
<p>Installation is a little complicated, an experienced <a href="http://www.symfony-project.org/" target="_blank">Symfony</a> developer will come in handy here.   <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> suggests using <a href="http://sourceforge.net/projects/svnforeigncopy/" target="_blank">svnforeigncopy</a> to clone their <a href="http://trac.apostrophenow.org/wiki/ManualInstallation#WaystoDownloadtheApostropheSandboxProject" target="_blank">sandbox project</a>, but I could never get it to work. I suspect that <a href="http://git-scm.com/" target="_blank">Git</a> might be a better version control system for this application.</p>
<p>I had trouble with the server requirements, specifically missing <a href="http://netpbm.sourceforge.net/" target="_blank">Netpbm</a> for image manipulation caused the media repository to hang in my <a href="http://www.wampserver.com/en/" target="_blank">WAMP</a> setup.  This could have been handled better, but <a href="http://netpbm.sourceforge.net/" target="_blank">Netpbm</a> just had to be turned off.  At the suggestion of the <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> authors I got a <a href="http://servergrove.com/vps/pricing" target="_blank">$20/mo VPS</a> from <a href="http://servergrove.com/" target="_blank">ServerGrove</a> and all my (server) problems went away.</p>
<p>Having the admin interface integrated into the frontend means that it&#8217;s sometimes in the way.  This is easily solved by adjusting the CSS to position the admin buttons.</p>
<p>Another issue with having the admin interfaces embedded in the page is the requirement for additional wrapping &lt;div&gt; tags.  This will look like <a href="http://www.tyssendesign.com.au/articles/faqs/what-is-divitis/" target="_blank">divitis</a>, and make your CSS rules more complicated.</p>
<p>I ran into a couple bugs that I attribute to the CMS being fairly new.  I&#8217;ve noticed the that the project is updated fairly frequently so I expect the stability to increase quickly.</p>
<p>Lastly, I&#8217;m a little concerned that my clients are going to ask me for ways to edit meta tags, like title, description, &amp; keywords.  I&#8217;ve seen no easy way of accomplishing this, however it seems like a easy feature so I suspect it to be added in the near future.  If a client needs it I&#8217;m sure I could make this happen without too much effort.</p>
<h3>So what do I do when I run into a problem?</h3>
<p>The <a href="http://www.punkave.com/" target="_blank">PunkAve</a> crew that authored <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> are very helpful on the <a href="http://groups.google.com/group/apostrophenow" target="_blank">Google Group</a>.  I usually got responses in under an hour.  Before asking for help make sure to go through the <a href="http://trac.apostrophenow.org/wiki/ManualInstallation#ApostropheManual" target="_blank">Manual</a>, <a href="http://trac.apostrophenow.org/wiki" target="_blank">Wiki</a>, <a href="http://trac.apostrophenow.org/query" target="_blank">Trac bug list</a>, and search the existing Google Group messages.</p>
<h3>Closing thoughts.</h3>
<p><a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> is my new favorite CMS, well actually it&#8217;s the only CMS I would choose to use.  I really do not enjoy working with <a href="http://wordpress.org/" target="_blank">WordPress</a> &amp; <a href="http://drupal.org/" target="_blank">Drupal</a>, and <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> is an outstanding alternative.  I&#8217;m very excited about the new <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> plugins for a <a href="http://www.symfony-project.org/plugins/apostropheBlogPlugin" target="_blank">blog</a> and a <a href="http://www.symfony-project.org/plugins/apostropheFormBuilderPlugin" target="_blank">form builder</a>. I&#8217;m actually looking for excuses to use them, maybe <a href="http://www.robertspeer.com" target="_blank">robertspeer.com</a> is due for a rebuild. A little bird told me about some exciting developments in the <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> world, follow <a href="http://twitter.com/apostrophenow" target="_blank">@apostrophenow</a> to be the first to know.</p>
<h3>About the author:</h3>
<p>Hello, I&#8217;m <a href="http://www.robertspeer.com/blog/symfony-development/" target="_blank">Robert Speer</a> a web professional experienced in leading the development of large web applications.  Currently I&#8217;m working on a property marketing web application that I plan on integrating <a href="http://www.apostrophenow.com/" target="_blank">Apostrophe</a> into.  I&#8217;m also accepting project work to fund my bootstrapping efforts, <a title="Contact me for symfony development" href="http://www.robertspeer.com/blog/symfony-development/">contact me</a> for more information.</p>
<p><strong>My Links: </strong> <strong> </strong> <strong> </strong> <strong> </strong></p>
<ul>
<li><span style="font-weight: normal;"><strong><span style="font-weight: normal;"><a href="http://www.linkedin.com/in/roberthspeer" target="_blank">http://www.linkedin.com/in/roberthspeer</a></span></strong></span></li>
<li><span style="font-weight: normal;"><a href="http://www.twitter.com/robert_speer" target="_blank">http://www.twitter.com/robert_speer</a></span></li>
<li><span style="font-weight: normal;"><a href="http://www.google.com/profiles/rhspeer" target="_blank">http://www.google.com/profiles/rhspeer</a></span></li>
</ul>
<p style="text-align: center;"><a class="aligncenter" href="http://www.dzone.com/links/apostrophenow_a_cms_so_easy_even_your_mom_could_u.html" target="_blank"><strong><span style="color: #003366;">If you found this review valuable please click here to vote it up on DZone </span></strong></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/apostrophenow-a-cms-so-easy-even-your-mom-could-use-it/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>symfony 1.3 Book by Tim Bowler &amp; Wojciech Bancer</title>
		<link>http://www.robertspeer.com/blog/symfony-1-3-book/</link>
		<comments>http://www.robertspeer.com/blog/symfony-1-3-book/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 04:08:55 +0000</pubDate>
		<dc:creator>Robert Speer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=87</guid>
		<description><![CDATA[Symfony 1.3 Web Application Development is the latest book on the symfony PHP web framework and the first not written by the authors of the framework. This allows the authors to adopt a more pragmatic style that favors 3rd party plugins.  This is a good thing because IMHO the most important thing about a framework [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.packtpub.com/symfony-1-3-web-application-development/book" target="_blank">Symfony 1.3 Web Application Development</a> is the latest book on the <a href="http://www.symfony-project.org" target="_blank">symfony </a>PHP web framework and the first not written by the authors of the framework.</p>
<p>This allows the authors to adopt a more pragmatic style that favors <a href="http://www.symfony-project.org/plugins/" target="_blank">3rd party plugins</a>.  This is a good thing because IMHO the most important thing about a framework is it&#8217;s library of extensions.<span id="more-87"></span></p>
<p>The book also has a nice blend of information available in the already available <a href="http://www.symfony-project.org">symfony</a> <a href="http://www.symfony-project.org/book/1_2/" target="_blank">book</a>, <a href="http://www.symfony-project.org/cookbook/1_2/en/">cookbook</a>, and <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/" target="_blank">book length tutorials</a> using the techniques that a actual development team would use.</p>
<p>Unfortunately this book was pushed out before <a href="http://www.symfony-project.org/installation/1_3">symfony 1.3</a> was finished, and apparently before a sufficiently detail oriented proofer could go through the book.  Luckily the issues are primarily non-technical and mostly limited to the first few chapters and should not deter you from purchasing the book.</p>
<p>The most notable technical issue I have with the book is the use of a <a href="http://en.wikipedia.org/wiki/XML" target="_blank">XML</a> schema instead of a <a href="http://en.wikipedia.org/wiki/YAML">YAML</a> one, this actually works fine, it&#8217;s just a non-standard way of doing it.  Also sometimes it feels like the authors did a search for <a href="http://www.symfony-project.org/installation/1_2" target="_blank">1.2</a> and replaced it with <a href="http://www.symfony-project.org/installation/1_3" target="_blank">1.3</a>, again this is not that big a deal because the differences between the versions are mostly not relevant to beginner or intermediate<a href="http://trac.symfony-project.org/wiki/DevelopersForHire" target="_blank"> symfony developers</a>.</p>
<p>So would I recommend this book?  Yes, especially if <a href="http://www.packtpub.com/symfony-1-3-web-application-development/book" target="_blank">PAKT</a> comes out with a second revision with better editing.  This book provides valuable real world examples and accessible detail that eases the difficult learning curve of <a href="http://www.symfony-project.org/" target="_blank">symfony</a> development.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/symfony-1-3-book/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Internationalized (i18n) Admin Generator CRUD&#8217;s in Symfony 1.2.9 + Doctrine</title>
		<link>http://www.robertspeer.com/blog/i18nadmingenerator/</link>
		<comments>http://www.robertspeer.com/blog/i18nadmingenerator/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 22:50:43 +0000</pubDate>
		<dc:creator>Robert Speer</dc:creator>
				<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[internationalization]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=64</guid>
		<description><![CDATA[I was having some trouble finding documentation on how to i18n generated CRUD&#8217;s, so once I figured (most) of it out I thought I&#8217;d share it The Example Application Since I have to create a feature in my one of my current work projects to store random bits of content, like privacy policies and such, [...]]]></description>
			<content:encoded><![CDATA[<p>I was having some trouble finding documentation on how to i18n generated CRUD&#8217;s, so once I figured (most) of it out I thought I&#8217;d share it</p>
<h2><span style="font-weight: normal;">The Example Application</span></h2>
<p><a href="http://www.robertspeer.com/i18n CRUD edit view.jpg" target="_blank"><img class="size-medium wp-image-69 alignright" title="i18n CRUD edit view" src="http://www.robertspeer.com/blog/wp-content/uploads/2009/10/i18n-CRUD-edit-view-168x300.jpg" alt="Content Block CRUD with French langage selected" width="168" height="300" /></a></p>
<p>Since I have to create a feature in my one of my current work projects to store random bits of content, like privacy policies and such, in multiple languages. I thought I&#8217;d double dip and use that for this example.  I&#8217;m calling the feature content blocks.  It will have a backend CRUD that will facilitate translations.  The UI I needed was to have the default language show up as well as one of the many languages this information would be translated into.  My app has the possibility of having more than 20 language options so putting them all in the CRUD at once was unreasonable.<span id="more-64"></span></p>
<p>The example to the left shows what the CRUD looks like when French is set as the user&#8217;s culture.  If the default language is chosen a second language form does not show up.</p>
<p>On the frontend I&#8217;m just going to do a simple data pull for this example.  Both the frontend and the backend app will have very simple language switchers  to demonstrate how that works.<br />
Now that I now how this works it&#8217;s actually pretty darn simple, however figuring it out took longer than I&#8217;d like.  Hopefully this tutorial will save you some time.</p>
<p>I&#8217;m going to skip the application setup, if you don&#8217;t know how to do that I used the same steps that are in the Doctrine version of the <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/01">Jobeet tutorial</a>.</p>
<p><a href="http://www.robertspeer.com/i18n_demo.zip" target="_self">Download the example app zip file here, includes Symfony 1.2.9</a></p>
<h2>Doctrine schema.yml</h2>
<p>The database schema.yml was by a little tricky at first.  I did not realize that Doctrine handles I18n tables so much differently from Propel.  With Propel I would have defined a second table named content_block_i18n and put the translated fields there.  For Doctrine they simply go in under the actAs and I18n.  This is less typing and I suspect more intuitive for those who don&#8217;t already know Propel.</p>
<p>Also remember to put columns: before your field definitions, and leave out the connection at the top of the file.  Timestammable adds the created_at &amp; updated_at fields.  Also notice that the data types are different from Propel&#8217;s.</p>
<p>I think I&#8217;m going to like these changes, but they are different so be careful if you are used to Propel.<br />
<code><br />
content_block:<br />
actAs:<br />
Timestampable: ~<br />
I18n:<br />
fields: [short_title, title, extract, content]<br />
columns:<br />
weight: integer<br />
active: boolean<br />
short_title: string(50)<br />
title:       string<br />
extract:     string<br />
content:     string(4000)<br />
</code><br />
Once you&#8217;re done: create your database, edit databases.yml, build-all, and clear you cache.  Details are in the Jobeet tutoral in <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/03" target="_blank">Day 3: The Data Model</a>.</p>
<h2>Adding embedI18n() to the form class a.k.a: where the magic happens</h2>
<p>This part took some serious research, I was just sure all I had to do was edit something in the generator.yml, but that turned out not to be the case.</p>
<p>I finally found  embedI18n() in the Forms in Action book in the i18n chapter under <a href="http://www.symfony-project.org/forms/1_2/en/08-Internationalisation-and-Localisation#chapter_08_propel_objects_internationalization">Propel Objects Internationalization</a>.  It does use the much maligned sfContext, and if you know a better way write a comment.</p>
<p>You&#8217;ll want to generate forms(php symfony doctrine:generate-forms) &amp; then the contend block CRUD (php symfony doctrine:generate-admin backend ContentBlock), as well as turn I18n on in the backend settings.yml.</p>
<p>This is in: lib/form/content_blockForm.class in the example application.<br />
<code><br />
/**<br />
* content_block form.<br />
*<br />
* @package    form<br />
* @subpackage content_block<br />
*/<br />
class content_blockForm extends Basecontent_blockForm<br />
{<br />
/**<br />
* Form configuration settings<br />
*<br />
* @author Robert H. Speer<br />
*/<br />
public function configure()<br />
{<br />
$this-&gt;embedI18n(array(sfConfig::get('sf_default_culture', 'en'),<br />
$this-&gt;getCurrentCulture())<br />
);<br />
}<br />
</code><br />
<code><br />
/**<br />
* pulls the current culture from the user object<br />
*<br />
* @return string<br />
* @author Robert H. Speer<br />
*<br />
* Notes:<br />
*  RHS 10/2/09 - sfContext::getInstance() violates MVC but I don't know a way<br />
*                around it ATM.<br />
*/<br />
public function getCurrentCulture()<br />
{<br />
$culture = sfContext::getInstance()-&gt;getUser()-&gt;getCulture();</code></p>
<p><code>if (strlen($culture)&gt;0) { // return user selected language<br />
return $culture;<br />
}else{ // return default culture, or defaults to english<br />
return sfConfig::get('sf_default_culture', 'en');<br />
}<br />
}</code></p>
<p><code>}</code></p>
<p><code> </code></p>
<h2>A simple language switcher component</h2>
<p>I&#8217;ve included a very simple language switching component in the example application.  Assuming you know <a href="http://www.symfony-project.org/book/1_2/07-Inside-the-View-Layer#chapter_07_sub_components" target="_self">how to write a component</a>, it&#8217;s not a big deal.</p>
<p>The actual language setter is in both apps (i know wet is bad) under language_switcher/actions/action.class.php &amp; looks like this:<br />
<code><br />
/**<br />
* changes the users culture and redirects them back the their previous page<br />
*<br />
* @author Robert H. Speer<br />
*/<br />
public function executeLanguage() {<br />
$this-&gt;getUser()-&gt;setCulture($this-&gt;getRequestParameter('culture'));</code></p>
<p><code> </code><code> $url = $this-&gt;getRequest()-&gt;getReferer() != '' ? $this-&gt;getRequest()-&gt;getReferer() : '@homepage';<br />
$this-&gt;redirect($url);<br />
}<br />
</code><br />
It&#8217;s going to take the user&#8217;s selected culture set that to the user object, and then redirect causing a refresh.</p>
<h2>How to get at that translated content</h2>
<p>This is the easy part, you actually don&#8217;t have to do anything special to grab content in the language set in the user object, just get the object and call the getter.</p>
<p>Grab the object(s) with something like this, but preferably in the model layer instead of apps/frontend/homepage/actions/action.class.php:<br />
<code><br />
/**<br />
* Executes index action<br />
*<br />
* @param sfRequest $request A request object<br />
*/<br />
public function executeIndex(sfWebRequest $request)<br />
{<br />
$this-&gt;block = Doctrine::getTable('content_block')-&gt;createQuery('a')-&gt;execute();<br />
}<br />
</code><br />
Then in your template you can access all the fields just like if they were in the same table (this is really cool):<br />
<code><br />
/**<br />
* Very simple homepage for demo purposes only<br />
*<br />
* @author Robert H. Speer<br />
*/<br />
foreach ($block as $key=&gt;$row)<br />
{<br />
echo 'id: '.$row-&gt;getId().'&lt;br&gt;';<br />
echo 'weight: '.$row-&gt;getWeight().'&lt;br&gt;';<br />
echo 'short title: '.$row-&gt;getShortTitle().'&lt;br&gt;';<br />
echo 'title: '.$row-&gt;getTitle().'&lt;br&gt;';<br />
echo 'extract: '.$row-&gt;getExtract().'&lt;br&gt;';<br />
echo 'content: '.$row-&gt;getContent().'&lt;br&gt;';<br />
echo 'created at: '.$row-&gt;getCreatedAt().'&lt;br&gt;';<br />
echo 'updated at: '.$row-&gt;getUpdatedAt().'&lt;br&gt;';<br />
echo 'lang: '.$row-&gt;getLang().'&lt;br&gt;';<br />
echo '&lt;hr&gt;';<br />
}</code></p>
<p>If you get the example app going on your own machine add a few records with some translations, then change the language with the language drop down and it will just work automagicaly.  For your own apps remember to turn I18n on in your applications settings.yml.</p>
<h2>Reference Links</h2>
<ul>
<li>As always the Symfony&#8217;s sweet <a href="http://www.symfony-project.org/doc/1_2/">documentation</a></li>
<li>Sandbox Web Solutions does a great job of explaining a <a href="http://sandbox-ws.com/frameworks/symfony-frameworks/how-to-embed-forms-in-symfony-12-admin-generator-part-3" target="_blank">different way to embed i18n forms in a generated CRUD</a></li>
</ul>
<h2>What I have not figured out yet</h2>
<ul>
<li>I have got the file upload widget to show up in the Admin generator but I it does not work automagicaly, like I think it should, I think I&#8217;m going to have to write the file handler myself.
<ul>
<li><em>edit 10/04/09 10:42PM</em> -&gt; <a href="http://stereointeractive.com/blog/2008/12/23/symfony-12-upload-a-file-inside-an-embedded-form/" target="_blank">Stereo Interactive has a work around for this</a></li>
</ul>
</li>
<li>Getting at the embedded fields in the generator.yml is elusive as well.</li>
</ul>
<p>I&#8217;ll be working on both of these problems as soon as I get back to work, so hopefully I&#8217;ll have an update soon.  If you figure it out first please write a comment.</p>
<h3><em>Disclaimer:</em></h3>
<p><em>By the time I was done writing this tutorial I was very ready to not be at my computer anymore, there are going to be some grammatical mistakes and maybe some code ones as well.  I through this together on WAMP, on my home desktop, so you may have to change the slashes on your path, and update your apache conf &amp;/or your .htaccess file to get it to work.  The application I&#8217;ve uploaded does work, but it is just a demo so don&#8217;t trust it too much <img src='http://www.robertspeer.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/i18nadmingenerator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony Plugin Review: sfEasyGMapPlugin</title>
		<link>http://www.robertspeer.com/blog/sfeasygmapplugin/</link>
		<comments>http://www.robertspeer.com/blog/sfeasygmapplugin/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 23:20:10 +0000</pubDate>
		<dc:creator>Robert Speer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=55</guid>
		<description><![CDATA[Symfony Plugin Review: sfEasyGMapPlugin The sfEasyGmapPlugin seeks to encapsulate much many of the features in the Google Maps API and make them easily available in the Symfony PHP 5 Framework. The Test: I set up a very basic Symfony 1.2.9 project and installed the plugin.  Installation of the plugin was a breeze the command line [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dzone.com/links/symfony_plugin_review_sfeasygmapplugin.html" target="_Dzone"><br />
<img src="http://widgets.dzone.com/links/images/std/vwidget3/vwidget_logo.gif" alt="Dzone" /><br />
</a></p>
<h2>Symfony Plugin Review: <a title="sfEasyGmapPlugin for Symfony" href="http://www.symfony-project.org/plugins/sfEasyGMapPlugin" target="_blank">sfEasyGMapPlugin</a></h2>
<p>The <a href="http://www.symfony-project.org/plugins/sfEasyGMapPlugin" target="_blank">sfEasyGmapPlugin</a> seeks to encapsulate much many of the features in the <a href="http://code.google.com/apis/maps/" target="_blank">Google Maps API</a> and make them easily available in the <a href="http://www.symfony-project.com" target="_blank">Symfony PHP 5 Framework</a>.<span id="more-55"></span></p>
<h3>The Test:</h3>
<p>I set up a very basic <a href="http://www.symfony-project.org/installation/1_2" target="_blank">Symfony 1.2.9</a> project and installed the plugin.  Installation of the plugin was a breeze the command line install worked flawlesly. Which is very nice, and unexpected, as many plugins work better if you install them manually.</p>
<p>The sample module worked exactly as advertised, after I corrected my Google Maps API key.</p>
<p>Pretty soon I had an example module created and was inputting my own locations, geocoding addresses, re centering, and using some nice syntactic sugar like the <a href="http://trac.symfony-project.org/browser/plugins/sfEasyGMapPlugin/trunk/lib/GMap.class.php#L682" target="_blank">centerAndZoomOnMarkers</a> method that does exactly what it says it does.</p>
<p>The example module covers the basics, but I&#8217;d also encourage you to browse through the <a href="http://trac.symfony-project.org/browser/plugins/sfEasyGMapPlugin/trunk/lib" target="_blank">classes </a>to get a sense of that this plugin will do.</p>
<p>My testing was fairly simplistic and I don&#8217;t have any experience with this app on a large application, however it would be my first choice if I had a project requiring mapping.</p>
<h3>The Results:</h3>
<p>The code is well done, object oriented, intuitive, &amp; very easy to use.</p>
<p>My only criticism is that it could do with a <a href="http://trac.symfony-project.org/browser/plugins/sfEasyGMapPlugin/trunk/lib/GMapMarker.class.php#L118" target="_blank">little more content</a> in it&#8217;s PHP docs, but that&#8217;s pretty minor.</p>
<p>I would strongly reccommend this plugin, and look forward to an excuse to use it, and I&#8217;d like to thank the authors for providing the community with such great code.</p>
<p>Thanks to:</p>
<ul>
<li><a href="http://www.symfony-project.org/plugins/developer/fabrice-bernhard">Fabrice Bernhard</a></li>
<li><a href="http://www.symfony-project.org/plugins/developer/laurent-bachelier">Laurent Bachelier</a></li>
<li><a href="http://www.symfony-project.org/plugins/developer/tom-haskins-vaughan">Tom Haskins-Vaughan</a></li>
<li><a href="http://www.symfony-project.org/plugins/developer/vincent-guillon">Vincent Guillon</a></li>
</ul>
<p>The authors come mostly from <a href="http://www.allomatch.com" target="_blank">Allomatch</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/sfeasygmapplugin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony refactor of the Zend Quick Start Tutorial</title>
		<link>http://www.robertspeer.com/blog/symfony-refactor-of-the-zend-quick-start-tutorial/</link>
		<comments>http://www.robertspeer.com/blog/symfony-refactor-of-the-zend-quick-start-tutorial/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 20:21:55 +0000</pubDate>
		<dc:creator>robert_speer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=24</guid>
		<description><![CDATA[Learning Zend Framework and getting a repetitive stress injury doing it Edit: please see Matthew Weier O&#8217;Phinney&#8217;s (the current project lead for Zend Framework) response in the comments, there are some exciting things comming for ZF My friends &#38; colleagues have used Zend Framework (ZF) for a while, and I do my best to avoid it [...]]]></description>
			<content:encoded><![CDATA[<p><a style="text-decoration: none;" href="http://digg.com/programming/Symfony_Zend_PHP_Frameworks_compared" target="_DIGG"><br />
<img src="http://digg.com/img/badges/100x20-digg-button.gif" alt="Digg!" width="100" height="20" /></a> <a href="http://www.dzone.com/links/symfony_zend_php_frameworks_compared.html" target="_Dzone"><img src="http://widgets.dzone.com/links/images/std/vwidget3/vwidget_logo.gif" alt="Dzone" /><br />
</a></p>
<h2>Learning Zend Framework and getting a repetitive stress injury doing it</h2>
<p><em>Edit: please see Matthew Weier O&#8217;Phinney&#8217;s (the current project lead for Zend Framework) response in the comments, there are some exciting things comming for ZF</em></p>
<p><span style="font-family: Tahoma; line-height: 16px; color: #584d40;"> </span></p>
<h5 style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font: normal normal normal 180%/normal Tahoma, Verdana, Arial, Helvetica, sans-serif; color: #362f2c; padding: 0px;"><span style="color: #000000; font-family: Georgia; font-size: 13px; line-height: 19px;">My friends &amp; colleagues have used <a href="http://framework.zend.com/" target="_blank">Zend Framework (ZF)</a> for a while, and I do my best to avoid it and use the <a href="http://www.symfony-project.org/">Symfony PHP framework</a>.  Initially I was open to learning ZF, I was just curious why people liked it.  The more questions I asked, the more I realized there were no good answers other than standards for standards sake, and variations on the <a href="http://en.wikipedia.org/wiki/Sunk_costs#Loss_aversion_and_the_sunk_cost_fallacy">Sunk Cost Fallacy</a>.  If pressed I was told that I had to give <a href="http://framework.zend.com/">Zend Framework</a> a chance because it is a younger framework than <a href="http://www.symfony-project.org/">Symfony</a>, (um no).  Some of the developers had even written a library to add on to<a href="http://framework.zend.com/"> Zend Framework</a> to make it more usable, it contained features that were already in <a href="http://www.symfony-project.org/">Symfony</a>.  IMHO, writing code to help a framework catch up is an excellent reason to switch to another framework.</span></h5>
<p>This last week I was finally forced to use <a href="http://framework.zend.com/">ZF</a>, my rebellious use of <a href="http://www.symfony-project.org/">Symfony</a> only served to annoy the other developers, and had the potential to increase maintenance costs.  It seemed like a reasonable request, and all those developers couldn&#8217;t be wrong could they?<span id="more-24"></span></p>
<p>Well yes they are.  I work with some great people whose feelings I don&#8217;t wish to hurt, but I would estimate that <strong><a href="http://framework.zend.com/">Zend Framework</a></strong><strong> projects cost between 20 to 40 hours more for projects that run around ~400 hour plus. </strong><strong> With agency rates what they are that could turn in to 6 or 7 thousand dollars of added costs. </strong>Assuming requirements for user authentication and backend CRUD&#8217;s.  These numbers will vary widely from project to project.</p>
<p>From a quick comparison of the <a href="http://www.symfony-project.org/blog/category/Case+studies" target="_blank">Symfony Case Studies</a> and the <a href="http://framework.zend.com/about/casestudies" target="_blank">Zend Framework Case studies</a> I would expect this efficiency gap to continue to increase.  A couple of <a href="http://framework.zend.com/">Zend Framework</a>&#8216;s case study subjects have already failed: <a href="http://services.alphaworks.ibm.com/graduated/qedwiki.html">QEDWiki</a> &amp; <a href="http://www.pokerroom.com/community/forum/msg-220313-0#53">PokerRoom.com</a>, and anyone who&#8217;s been unfortunate enough to have to customize <a href="http://www.magentocommerce.com/">Magento</a> likely regrets the experience.   Symfony&#8217;s case studies are large successful projects you may have heard of:  <a href="http://www.symfony-project.org/blog/2009/02/18/dailymotion-powered-by-symfony">DailyMotion</a>, <a href="http://www.symfony-project.org/blog/2008/05/08/yahoo-answers-powered-by-symfony">Yahoo! Answers</a>, <a href="http://www.symfony-project.org/blog/2007/10/02/delicious-preview-built-with-symfony">Delicious</a>, &amp; <a href="http://www.symfony-project.org/blog/2006/10/28/yahoo-bookmarks-uses-symfony">Yahoo! Bookmarks</a>.  To be fair I&#8217;ve seen some really nice <a href="http://framework.zend.com/">Zend Framework</a> apps, I&#8217;ve just seen more interesting and larger <a href="http://www.symfony-project.org/">Symfony</a> projects.</p>
<h2>A Quick Comparison</h2>
<p>To present as fair a comparison as possible I have rewritten the <a href="http://framework.zend.com/docs/quickstart" target="_blank">Zend Framework Quick Start</a> as a <a href="http://www.symfony-project.org/">Symfony</a> app. I also used <a href="http://www.symfony-project.org/">Symfony</a> 1.2 with the Doctrine ORM, both of which I&#8217;ve not used before, as my projects have been in <a href="http://www.symfony-project.org/">Symfony</a> 1 or 1.1 and the Propel ORM so far.</p>
<p>I&#8217;ve formatted this more as a timeline of events rather than a tutorial, however the full <a href="http://www.symfony-project.org/">Symfony</a> app source is available <a href="http://www.robertspeer.com/sfZendQuickStart.zip" target="_self">HERE</a>.  To drop it on your web server you will have to change the path to <a href="http://www.symfony-project.org/">Symfony</a> in config/ProjectConfiguration.class.php, I had it running through <a href="http://www.wampserver.com/en/">WAMP</a> on my local machine.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">sfZendQuickStart Post</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:15am &#8211; 9:30am set up symfony app</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:30am -9:38am skip a bunch of Zend configs and translate layout to sf</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:40am &#8211; 9:43am generated controller &amp; view, skipping autoloading in the bootstrap file</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:43am &#8211; 10:06am set up database</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>wrote schema.yml to define guestbook table</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>setup database connection string:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony configure:database &#8211;name=doctrine &#8211;class=sfDoctrineDatabase &#8220;mysql:host=localhost;dbname=guestbook&#8221; username password</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> building model  (10:06am &#8211; 10:20am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony doctrine:build-model (GSS)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony doctrine:build-sql   (generates the sql)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony doctrine:insert-sql  (putst the sql in the db)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>skipping the build database stuff, symfony does that for us</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Listing out all guestbook entries in view 10:20am &#8211; 10:35am (got distraced with doctrine, I usually use propel)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Generating form classes (10:48am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>configuring to remove created at from view</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>unset( $this['created_at'], $this['updated_at'] );</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>random interruptions by wife&#8230;.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>writing view layer (11 am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>writing controller for saving  (11:15am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Setting up captcha</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>installing form extra plugin:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony plugin:install sfFormExtraPlugin</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>apparently I can&#8217;t type, kept putting the api keys in wrong , fancy reCaPTCHA complete (11:51am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Double checked ZF Quick Start to make sure I did not forget anything</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>done (11:54am),</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> ~2hrs 39 min</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>with distractions, a mySQL db, and a decent captcha</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> under 150 lines of me-written code code, including html I C&amp;P&#8217;d from the zend tutorial</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>this means much less fumble finger type mistakes</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>The only config files I touched were</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>config/ProjectConfiguration.class.php to use Doctrine instead of propel automagically</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>config/doctrine/schema.yml to define the db tables</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>config databases.yml was set up from the command line so you be the judge on that one</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Zend</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Bootstrap file configuration</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>appliation.ini configuration</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>the zf tutorial expects you to write around 515 lines of code to do the same thing</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>that&#8217;s from the tutorial text not the well commented source code.</div>
<p>This also serves to document how I wasted a perfectly wonderful summer morning, *sigh*.</p>
<p>I did change some things around, I used MySQL because I&#8217;m not familiar with sqLite and, I used reCaptcha instead of a captcha similar to the tutorials.  I think these add difficulty, and are fair changes.</p>
<ol>
<li><span style="white-space: pre;"> </span>9:15am &#8211; 9:30am set up symfony app</li>
<li>9:30am -9:38am skip a bunch of Zend configs and translating layout to sf</li>
<li>9:40am &#8211; 9:43am generated controller &amp; view, skipping autoloading in the bootstrap file</li>
<li>9:43am &#8211; 10:06am set up database
<ol>
<li>wrote schema.yml to define guestbook table</li>
</ol>
<ol>
<li>setup database connection string:
<ol>
<li>php symfony configure:database &#8211;name=doctrine &#8211;class=sfDoctrineDatabase &#8220;mysql:host=localhost;dbname=guestbook&#8221; username password</li>
</ol>
</li>
</ol>
<ol>
<li>10:06am &#8211; 10:20am building model
<ol>
<li>php symfony doctrine:build-model (Getters, Setters &amp; Stuff or GSS)</li>
<li>php symfony doctrine:build-sql   (generates the sql)</li>
<li>php symfony doctrine:insert-sql  (inserts the sql into the db)</li>
<li>skipping the build database script, symfony does that for us</li>
</ol>
</li>
</ol>
</li>
<li>10:20am &#8211; 10:35am Listing out all guestbook entries in view  (got distracted with <a href="http://www.doctrine-project.org/" target="_blank">doctrine</a>, I usually use <a href="http://propel.phpdb.org/trac/" target="_blank">propel</a>)</li>
<li>10:48 am Generating form classes
<ol>
<li>configuring to remove created at from view
<ol>
<li>unset( $this['created_at'], $this['updated_at'] );</li>
</ol>
</li>
</ol>
</li>
<li>random interruptions by wife&#8230;.</li>
<li>11 am writing view layer</li>
<li>11:15am writing controller for saving</li>
<li>Setting up captcha
<ol>
<li>installing form extra plugin
<ol>
<li>php symfony plugin:install <a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_blank">sfFormExtraPlugin</a></li>
<li><a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_blank"></a>I can&#8217;t type, kept putting the api keys in wrong , fancy <a href="http://recaptcha.net/" target="_blank">reCaPTCHA</a> complete (11:51am)</li>
</ol>
</li>
</ol>
</li>
<li>Double checked <a href="http://framework.zend.com/docs/quickstart">ZF Quick Start</a> to make sure I did not forget anything</li>
<li>11:54am done</li>
</ol>
<h3>Development Highlights:</h3>
<h4>Symfony:</h4>
<ul>
<li><strong>under 150 lines of me-written code</strong>, including html I C&amp;P&#8217;d from the zend tutorial
<ul>
<li>this means much less fumble finger type mistakes</li>
</ul>
</li>
<li>~2hrs 39 min to complete from httpd.conf setup to form submission.
<ul>
<li>with distractions, a mySQL db, and a reCaptcha</li>
<li>I&#8217;ve clearly spent more time complaining about Zend Framework than it would take to complete the mini app in Symfony</li>
</ul>
</li>
<li>The only config files I touched were
<ul>
<li>config/ProjectConfiguration.class.php to use Doctrine instead of propel auto-magically</li>
</ul>
<ul>
<li>config/doctrine/schema.yml to define the db tables</li>
</ul>
<ul>
<li>config databases.yml was set up from the command line so you be the judge on that one</li>
</ul>
</li>
</ul>
<h4>Zend:</h4>
<ul>
<li>Configuration done in:
<ul>
<li>Bootstrap file configuration</li>
</ul>
<ul>
<li>appliation.ini configuration</li>
</ul>
</li>
<li>the zf tutorial expects you to write around<strong> 515 lines of code</strong> to do the same thing as Symfony
<ul>
<li>that&#8217;s from the tutorial text not the well commented source code.</li>
</ul>
</li>
<li>Also there promise of a &#8220;30-minute tour&#8221; can&#8217;t mean that you can program it in 30 minutes</li>
</ul>
<h2>Conclusions</h2>
<p><a href="http://framework.zend.com/" target="_blank">Zend Framework</a> is not bad, compared to using plain PHP there are some significant efficiency gains to be made.  However, when compared with <a href="http://www.symfony-project.org/">Symfony</a> and other frameworks, like <a href="http://www.djangoproject.com/" target="_blank">Django</a> &amp; <a href="http://rubyonrails.org/">Rails</a>,  it&#8217;s missing key features found in modern Web Development frameworks.  The tutorial I described here demonstrated the efficiency issues of not having code generation for the Model layer.  Two other key features are generated CRUD&#8217;s for backend site management, and a full MVC plugins like <a href="http://www.symfony-project.org/">Symfony</a>, <a href="http://rubyonrails.org/">Rails</a>, &amp; <a href="http://www.djangoproject.com/" target="_blank">Django</a> all have.</p>
<p>The long term ramifications of not having plugins and generated code accelerating your project are corners cut on quality, reduced features, scaling problems, and less competitive bids.  The lack of robust plugins in Zend also means that it will never be able have as many features as frameworks that do have Plugins.  Not having code generation means that developers are spending too much time writing mindless getter&#8217;s, setter&#8217;s, &amp; data grids and not enough time focusing on the core features of the project, or worse they are making compromises in quality to make deadlines.</p>
<p>I don&#8217;t believe that the <a href="http://framework.zend.com/" target="_blank">Zend Framework</a> is so far behind that it can&#8217;t catch up.  In certain areas it&#8217;s actually ahead of the game, however those areas tend to not be fascinating edge cases I get to use every so often, and not features I use on every site every day.  My suggestion for Zend is use the Model layer examples available (<a href="http://ar.rubyonrails.org/" target="_blank">Active Record</a>,  <a href="http://www.sqlalchemy.org/" target="_blank">SQLAlchemy</a>, <a href="http://www.doctrine-project.org/">Doctrine</a>) and  do something like that.  <a href="http://ruben.savanne.be/articles/integrating-zend-framework-and-doctrine" target="_blank">Doctrine already integrates well with Zend</a>, maybe that would be a good option.  Then start generating admin interfaces or <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a>&#8216;s, this is huge, I find all kinds of ways to use these things to add value to my projects with a little typing on the command line.  Finally Plugins, the most important consideration when reviewing a framework or <a href="http://en.wikipedia.org/wiki/Content_management_system">CMS</a>.  The quantity and quality of plugins demonstrates the quality of the development tool.  It also means that there are developers out there that care about the tool outside of the core team.</p>
<p>If you are interested in learning more about Symfony there are excellent tutorials like the <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/">Jobeet example app</a>, a<a href="http://www.symfony-project.org/cookbook/1_2/en/"> cookbook</a>, a <a href="http://www.symfony-project.org/book/1_2/">guide book</a>, a <a href="http://www.symfony-project.org/cookbook/1_2/en/">reference book</a>, an <a href="http://www.symfony-project.org/api/1_2/">API</a>, and more on the <a href="http://www.symfony-project.org/doc/1_2/" target="_blank">symfony doc&#8217;s page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/symfony-refactor-of-the-zend-quick-start-tutorial/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Webdigs.com, (with symfony inside) recognized as &#8220;kick ass&#8221; by Future of Real Estate Marketing</title>
		<link>http://www.robertspeer.com/blog/webdigscom-with-symfony-inside-recognized-as-kick-ass-by-future-of-real-estate-marketing/</link>
		<comments>http://www.robertspeer.com/blog/webdigscom-with-symfony-inside-recognized-as-kick-ass-by-future-of-real-estate-marketing/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 01:07:04 +0000</pubDate>
		<dc:creator>robert_speer</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=13</guid>
		<description><![CDATA[Future of Real Estate Marketing, a pretty awesome real estate blog, listed Webdigs.com as one of 10 &#8220;kick ass&#8221; real estate search sites. This project would have been MUCH more difficult without Symfony providing structure, keeping the teams code somewhat consistent, taking care of so much drudgery. http://www.futureofrealestatemarketing.com/10-kick-ass-real-estate-search-sites/ I got to admit, this was pretty [...]]]></description>
			<content:encoded><![CDATA[<p>Future of Real Estate Marketing, a pretty awesome real estate blog, listed <a href="http://www.webdigs.com" title="Webdigs Real Estate Search">Webdigs.com</a> as one of 10 &#8220;kick ass&#8221; real estate search sites.</p>
<p>This project would have been MUCH more difficult without <a href="http://www.symfony-project.org" title="Symfony Home Page" target="_blank">Symfony</a> providing structure, keeping the teams code somewhat consistent, taking care of so much drudgery.</p>
<p><a href="http://www.futureofrealestatemarketing.com/10-kick-ass-real-estate-search-sites/" title="10 kick ass real estate search sites" target="_blank">http://www.futureofrealestatemarketing.com/10-kick-ass-real-estate-search-sites/</a></p>
<p>I got to admit, this was pretty cool, but not as cool as <a href="http://www.youtube.com/watch?v=f2b1D5w82yU" title="Halo 3 Gameplay">this</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/webdigscom-with-symfony-inside-recognized-as-kick-ass-by-future-of-real-estate-marketing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Happy Birthday Symfony (1st Symfony recruiter call, Zend Framework, &amp; a happy client)</title>
		<link>http://www.robertspeer.com/blog/happy-birthday-symfony-1st-symfony-recruiter-call-zend-framework-a-happy-client/</link>
		<comments>http://www.robertspeer.com/blog/happy-birthday-symfony-1st-symfony-recruiter-call-zend-framework-a-happy-client/#comments</comments>
		<pubDate>Fri, 19 Oct 2007 22:40:05 +0000</pubDate>
		<dc:creator>robert_speer</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=10</guid>
		<description><![CDATA[This last week has been really got me feeling pretty positive about the future of the Symfony PHP framework. Last Thursday Erica Guay (erica D0T guay AT Sapphire.com) called me and is the first recruiter to ask me if I knew the Symfony framework. She&#8217;s got a pretty awesome opportunity near Boston, MA to fill [...]]]></description>
			<content:encoded><![CDATA[<p>This last week has been really got me feeling pretty positive about the future of the Symfony PHP framework.</p>
<p>Last Thursday <span class="dReadMsgHeaderSender"><strong>Erica Guay</strong> (erica D0T guay AT <a href="http://www.sapphire.com">Sapphire.com</a>)</span>  called me and is the first recruiter to ask me if I knew the Symfony framework.  She&#8217;s got a pretty awesome opportunity near Boston, MA to fill if anyone is interested.</p>
<p>The next Tuesday I went to a presentation at <a href="http://events.sierrabravo.net/">Sierra Bravo</a> here in Minneapolis, MN about the Zend Framework and Lucene.  Maybe I&#8217;m a fanboy but it really looks like Zend has some catching up to do.  <a href="http://lucene.apache.org/">Lucene</a> is impressive and there is a <a href="http://trac.symfony-project.com/wiki/sfLucenePlugin">Symfony plugin</a> for it.   Justin, Tom, and the rest of the <a href="http://events.sierrabravo.net/"><font size="2"><font face="Courier New">Sierra Bravo</font></font></a> Crew have already cranked out 5 Zend Framework sites but when I showed them the development environment  in Symfony someone in the crowd literally said &#8220;wow&#8221;. It was admittedly a pretty nerdy bunch, when Justin (the presenter) mentioned a design patterns book he liked the guy next to me tapped his chest and made the peace line and said &#8220;that&#8217;s who I&#8217;m down with&#8221; <img src='http://www.robertspeer.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   If you are interested in attending their next presentation RSVP <a href="http://events.sierrabravo.net/">here</a>.</p>
<p>The 3rd thing that reminded me how great Symfony is was just today when I showed a client an Admin Crud that I had created in about 30 min.  He was pretty excited, and it&#8217;s nice to have happy clients.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/happy-birthday-symfony-1st-symfony-recruiter-call-zend-framework-a-happy-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony PHP Framework &#8211; My first 10 months</title>
		<link>http://www.robertspeer.com/blog/symfony-php-framework-my-first-10-months/</link>
		<comments>http://www.robertspeer.com/blog/symfony-php-framework-my-first-10-months/#comments</comments>
		<pubDate>Sat, 01 Sep 2007 22:49:49 +0000</pubDate>
		<dc:creator>robert_speer</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=8</guid>
		<description><![CDATA[This is a narrative of my experience with the Symfony PHP 5 framework over the last 10 months. The short story is that I&#8217;m a fan, but it&#8217;s not perfect. An Overview of my experience with Symfony So I started learning Symfony about 10 months ago (November 2006), and I feel I can finally offer [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p> This is a narrative of my experience with the <a href="http://www.symfony-project.com">Symfony</a> <a href="http://www.php.net/">PHP 5</a> framework over the last 10 months.  The short story is that I&#8217;m a fan, but it&#8217;s not perfect.</p></blockquote>
<p><span id="more-8"></span></p>
<p><strong>An Overview of my experience with <a href="http://www.symfony-project.com">Symfony</a></strong></p>
<blockquote><p> So I started learning <a href="http://www.symfony-project.com">Symfony</a> about 10 months ago (November 2006), and I feel I can finally offer an informed opinion on the framework. Unfortunately <a href="http://www.symfony-project.com">Symfony</a> is the only framework I&#8217;m familiar with, and oddly enough <a href="http://www.php.net/">PHP</a> is my primary programming language.  So I don&#8217;t have anything to compare <a href="http://www.symfony-project.com">Symfony</a> to.</p>
<p>I started learning the <a href="http://www.symfony-project.com">Symfony</a> PHP framework after I was hired on at <a href="http://www.bigideas.com" target="_blank">MoCo</a>.  The senior Web Developer there had chosen <a href="http://www.symfony-project.com">Symfony</a> and was not interested in discussing any alternatives.  At the time <a href="http://www.symfony-project.com">Symfony</a> was still in beta, and the documentation actually fairly good for this early stage.  I ended up doing much of the front end View layer work for <a href="http://www.sanus.com" target="_blank">www.Sanus.com</a>.  Mostly because I was the only one, at the time, who had a good grasp of <a href="http://en.wikipedia.org/wiki/CSS" target="_blank">CSS</a>.  Later I moved on to having a better understanding of the Model layer and I&#8217;ve created, edited, &amp; queried databases many times using the integrated Propel Database Abstraction Layer.  Something that I wish I was more involved in on the <a href="http://www.sanus.com">Sanus.com</a> project was the i18n (internationalization) support, we were able to cram around 8 different languages into 1 <a href="http://en.wikipedia.org/wiki/Tableless_web_design">CSS layout</a>.  FYI, Russian uses the <a href="http://en.wikipedia.org/wiki/Cyrillic">Cyrillic</a> alphabet and it is both very long and will break many of PHP string functions, like <a href="http://us2.php.net/manual/en/function.ucfirst.php" target="_blank">ucfirst()</a>.</p>
<p>More recently at<a href="http://www.bigideas.com"> MoCo</a> we&#8217;ve been working on what is probably the best real estate site in the Upper Midwest (Minnesota, Wisconsin, Iowa, &amp; the Dakotas) <a href="http://www.webdigs.com" title="real estate ">Webdigs.com</a>.  With <a href="http://www.webdigs.com">Webdigs.com</a> I&#8217;ve spent much of my time working with the database layer, form validation, and building admin interfaces.  The most productive thing I&#8217;ve done is build a pretty decent little Content Management System out of a highly modified admin Interface that <a href="http://www.symfony-project.com">Symfony</a> &amp; <a href="http://propel.phpdb.org/trac/" target="_blank">Propel</a> pretty much created for me. This has freed me from having to deal with the 90+ pages of static content that&#8217;s been added to <a href="http://www.webdigs.com">Webdigs.com</a> so far.</p></blockquote>
<p><strong>Learning Curve</strong></p>
<blockquote><p> Getting started with <a href="http://www.symfony-project.com">Symfony</a> can be brutal.   Just getting it installed correctly takes a pretty decent understanding of Systems Administration, I still have not got it working correctly in windows, luckily I use a Subversion checkout on our development server. The first project is, of course, the most difficult afterwards things get MUCH easier.  I have noticed from a couple excellent additions to our team that Developers with some <a href="http://rubyonrails.org/">Ruby on Rails</a> experience have picked up <a href="http://www.symfony-project.com">Symfony</a> fairly easily, while the folks who have never used a framework tend to struggle with it longer.  I believe that it&#8217;s a mix of much of <a href="http://www.symfony-project.com">Symfony</a> being based off <a href="http://rubyonrails.org/">Ruby on Rails</a> &amp; learning <a href="http://rubyonrails.org/">Ruby on Rails</a> demonstrates both an intellectual curiosity &amp; a passion for <a href="http://en.wikipedia.org/wiki/Web_Development">Web Development</a>.</p>
<p>There are some excellent resources for learning <a href="http://www.symfony-project.com">Symfony</a>.  <a href="http://www.sitepoint.com">SitePoint.com</a> has a good &amp; current tutorial on <a href="http://www.symfony-project.com">Symfony</a> titled:  <a href="http://www.sitepoint.com/article/symfony-beginners-tutorial">Learn </a><a href="http://www.sitepoint.com/article/symfony-beginners-tutorial">Symfony</a><a href="http://www.sitepoint.com/article/symfony-beginners-tutorial">: a Beginner&#8217;s Tutorial</a>. <a href="http://www.phparch.com/" target="_blank">PHP | architect</a> also had 2 issues (<a href="http://www.phparch.com/issues.php" target="_blank">April &amp; May of 2007</a> ) in a row with good articles that provide an introduction to the <a href="http://www.symfony-project.com">Symfony</a> Framework.  There is also a<a href="http://www.amazon.com/dp/1590597869?tag=symfonyprojec-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=1590597869&amp;adid=0E8EEASTSYS05JS23TXC&amp;" target="_blank"> printed book</a> that I highly suggest purchasing and reading, however the book is also available <a href="http://www.symfony-project.com"></a><a href="http://www.symfony-project.com/book">online for free</a>.  Finally the <a href="http://www.symfony-project.com">Symfony</a> website: <a href="http://www.symfony-project.com">www.symfony-project.com</a> is a great resource.  A semi hidden gem  is the <a href="http://www.symfony-project.com/api/1_0" target="_blank"></a><a href="http://www.symfony-project.com/api/1_0" target="_blank">Symfony API</a>, it is hard to navigate, and the information is not perfect, but still very useful.  The <a href="http://www.symfony-project.com">Symfony</a> homepage also has some good tutorials, the best being the <a href="http://www.symfony-project.com/askeet/1_0"></a><a href="http://www.symfony-project.com/askeet/1_0">Askeet 24 days with Symfony</a> tutorial.  There is also a tutorial that I&#8217;ve had varying degrees of success with.  What I have found very helpful is reading the <a href="http://www.symfony-project.com">Symfony</a> source, it&#8217;s well written and fairly well commented. Another resource turns out to be my company&#8217;s direct competitor in the Twin Cities, <a href="http://www.spindrop.us" target="_blank">spindrop.us</a> which seems to be the domain of <a href="http://www.davedash.com/">Dave Dash</a>, who has contributed to several of <a href="http://trac.symfony-project.com/trac/wiki/SymfonyPlugins">Symfony&#8217;s plugins.</a></p></blockquote>
<p><strong> The Good </strong></p>
<blockquote><p> The best thing about <a href="http://www.symfony-project.com">Symfony</a> is that it lets me get things done faster.  I can create new functionality faster, because much of the drudgery has been largely removed from the equation.  I can maintain / update things faster because many things are standardized.  The gentle enforcement of the <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC (Model / Controller / View) </a>layers just makes sense after a while, and lends itself to reusable code.  I really like the<a href="http://en.wikipedia.org/wiki/Javascript"> Javascript</a> / <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29">Ajax</a> helpers, they have made me look like I&#8217;m much better at <a href="http://en.wikipedia.org/wiki/Javascript">Javascript</a> than I probably am.  The compartmentalization of the View layer (the part that deals with what you see) has allowed our team to have a more productive integration the Web Designers.  The ease of creating &amp; customizing  easy to use backend administration pages have allowed our technical writers to directly add &amp; edit content on the website.  This has allowed us to cut out some pretty big steps from our process, &amp; simplify communication.  <a href="http://www.symfony-project.com">Symfony</a> has allowed me to focus on more interesting tasks because of these efficiencies.</p>
<p>Another great thing about <a href="http://www.symfony-project.com">Symfony</a> are the <a href="http://trac.symfony-project.com/trac/wiki/SymfonyPlugins">plugins</a> that can be installed and add functionality without a huge amount of time.  The one I use the most is <a href="http://trac.symfony-project.com/trac/wiki/sfGuardPlugin">sfGuard</a>, which us a user management <a href="http://trac.symfony-project.com/trac/wiki/SymfonyPlugins">plugin</a>.</p></blockquote>
<p><strong> The Bad</strong></p>
<blockquote><p>It is not all a bed of roses.</p>
<p>Without someone around who is willing to hold your hand a little, learning <a href="http://www.symfony-project.com">Symfony</a> can be a daunting task.  It&#8217;s not so very difficult, and it gets easier every day with the additions to the knowledge base.</p>
<p>The way the databases are created, and modified can be maddening.  There does not appear to be a way to modify a single table and only rebuild the model layer function for it, the entire database must be dumped and rebuild.  To make matters worse the database backup system is broken and reloads data unreliably, again as far as I can tell.  I work around this by doing a <a href="http://www.mysql.com" target="_blank">MySQL</a> complete data dump, and reloading it when I&#8217;ve rebuild the database structure.</p>
<p>The documentation is not perfect, documentation never seems to be.  It is generally better than Microsoft documentation, but not as good as the <a href="http://www.php.net/manual/en/">PHP manual.</a></p>
<p>I once spent a couple hours combing through the documentation to find a solution to finally find a forum post that included a post by one of the <a href="http://www.symfony-project.com">Symfony</a> developers only to find that he was telling the forum poster to read documentation, that turned out to be so outdated as to be difficult to adapt.</p>
<p><a href="http://www.symfony-project.com">Symfony</a> does not have the same popularity level as Ruby on Rails.  In the Twin Cities of Minneapolis &amp; St. Paul Minnesota there are only 2 shops that I know of that use <a href="http://www.symfony-project.com">Symfony</a>, luckily the other place does not appear to have the same quality of designers that <a href="www.bigideas.com">MoCo</a> has. <img src='http://www.robertspeer.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p></blockquote>
<blockquote><p>Some of the <a href="http://trac.symfony-project.com/trac/wiki/SymfonyPlugins">plugins</a> really aren&#8217;t much, have very little documentation, and need a lot of work, but hey I didn&#8217;t have to pay for them either.</p></blockquote>
<blockquote></blockquote>
<p><strong>Conclusion </strong></p>
<blockquote><p>I believe the good vastly outweighs the bad, and since last November things have continued to improve.  I&#8217;m really looking forward to the 1.1 release, and further development in some really promising <a href="http://trac.symfony-project.com/trac/wiki/SymfonyPlugins">plugins</a>, like the<a href="http://trac.symfony-project.com/trac/wiki/sfSimpleCMSPlugin"> CMS</a><a href="http://trac.symfony-project.com/trac/wiki/sfSimpleCMSPlugin"> plugin</a>.</p>
<p>However I do hope to spend some time to look at the options that are out there.  I have not spent much time looking into the <a href="http://framework.zend.com/" target="_blank">Zend framework</a> or <a href="http://rubyonrails.org/">Ruby on Rails</a>.</p>
<p>The only changes to <a href="http://www.symfony-project.com">Symfony</a> that I would make would be to package up a solution that is ready to for most of a brochure type site, and ready to be modified for more advanced features.  I&#8217;d roll in the user management, a CMS, a Menuing system, and some basic frameworks and templates, and maybe a lot of what is in the <a href="http://code.google.com/p/blueprintcss/">Blueprint CSS framework</a>.</p>
<p>I&#8217;d also make it easier to make granular changes to databases after the Model layer  has been built.</p>
<p><a href="http://www.symfony-project.com">Symfony</a> is a great framework, it makes me a better more productive Web Developer and I believe it is worth consideration if you are looking for a new framework.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/symfony-php-framework-my-first-10-months/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
