<?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>Doggetto.com</title>
	<atom:link href="http://blog.doggetto.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.doggetto.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 05 Apr 2010 20:13:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>My Thoughts on Pres. Packer and Pres. Beck at the 2010 LDS General Conference</title>
		<link>http://blog.doggetto.com/2010/04/packer-beck-conference-2010/</link>
		<comments>http://blog.doggetto.com/2010/04/packer-beck-conference-2010/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 19:05:34 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[History]]></category>
		<category><![CDATA[Mormon]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[politics]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=607</guid>
		<description><![CDATA[The following is long because I want to make sure I approach the subject carefully.  It is indeed a soft criticism upon statements given by a man I believe to be an Apostle of God, so I can understand if the very idea can be seen as offensive to some.  I apologize for [...]]]></description>
			<content:encoded><![CDATA[<p class="intro">The following is long because I want to make sure I approach the subject carefully.  It is indeed a soft criticism upon statements given by a man I believe to be an Apostle of God, so I can understand if the very idea can be seen as offensive to some.  I apologize for that offense, but I believe the criticism is valid.<span id="more-607"></span></p>
<p class="intro">I am a little hesitant to share specifics with why I was disappointed with a particular talk from General Conference.  Over the next six months, many LDS (myself included) will study from the transcripts as published in next month&#8217;s &#8220;Ensign&#8221;; it&#8217;s expected that each talk can provide spiritual comfort and counsel.  I don&#8217;t want my personal opinion about a particular talk to somehow be seen as invalidating or belittling another person&#8217;s enjoyment of the same discourse;  my expectations are different and my concerns are different.  I don&#8217;t think that anyone in Church leadership is somehow dishonest, hypocritical, or evil.  I believe that they are all honest women and men who say the things they say because they believe in the doctrines of the LDS Church.  However, a leadership position in the Church doesn&#8217;t somehow disqualify someone from making a poor choice of words, or even from endorsing a particular point of view that may later be seen as uninspired (much of the pre-1978 folklore would qualify for this; much of it was publicly taught as truth and is now seen as nothing more than misguided opinion).  As someone listening to my leaders, I can only argue from a position that I believe in, and if that doesn&#8217;t match up completely with what I hear, then I need to look carefully at both what I believe and what was said.  Sometimes my beliefs change, and other times I reject the wild fruits in someone&#8217;s message and only prize the good fruits.  I&#8217;ve never found a talk given by a Church leader that didn&#8217;t have something in it that was worthy of study and implementation, but I&#8217;ve found a few that had some ideas that I had to leave behind because my beliefs simply could not agree with some of what was said.</p>
<p>The Church of Jesus Christ of Latter-day Saints is a small movement compared to many Protestant Christian denominations.  Its relative youth compared to the other three Abrahamic religions tends to mean it is easily mocked for its particular historical and faith claims which have occurred within the past two centuries; in spite of this the Church has grown considerably during that time (not nearly as much as the Pentecostal movement, for instance, but for a tightly organized movement, it is an impressive growth).  If it is to continue to be a force for good it must continue to grow; however, while the Church currently claims nearly 14 million members it is a guessing game as to how many of those are active in their practice, let alone how many have achieved the highest levels of activity expected for the general membership by attending the Temple or being ordained in the Priesthood.  The answer is certainly much lower than the pure membership numbers.  From other statistical sources, such as Gallup or Pew, we know that women form a clear majority of active Church membership.  As such, it might be expected that Church leadership would speak out more on issues relating to what is expected of all human beings, not just men, within the Church, with perhaps an occasional focus on women&#8217;s issues and their strength (by virtue of their numbers at the very least).  Such an emphasis was occasionally seen and heard during some of the past weekend, but it is interesting to me how that emphasis was expressed, especially in comparing and contrasting the first two discourses delivered.</p>
<p class="intro">President Boyd K. Packer spoke at length about how the Power of the Priesthood is not yet being expressed among the Priesthood holders of the Church. However, (without a transcript to compare against) he didn&#8217;t directly define the Power of the Priesthood, as opposed to the Authority of the Priesthood which I&#8217;ve continually read from Church sources to mean &#8220;the authority to act in God&#8217;s name&#8221; or, in other words, the authority to perform efficacious rituals and ordinances.  In the Church, women have not, as yet, been given such authority apart from their limited authority to perform some of the Temple rituals.  However, it appeared to me that the general gist of the &#8220;Power&#8221; being described was not simply the miraculous ability to enjoy gifts from God such as healing (a power that is equally available to women through the prayer of faith, as expressed by Elder Dallin H. Oaks during his Priesthood Session remarks, and as attested by much of Latter-day Saint Church history where administration and blessings on the sick by women are commonplace), but was also power in the sense of authority and responsibility in relation to other human beings.  I love that the Church has a structure that allows for people, both female and male, to hold positions of authority not because they have any particular skill for such positions but rather because the initial &#8220;calling&#8221; to that position was supposed to be the result of revelatory impressions.  I accept that it can on rare occasion be useful to have an individual who has a sort of &#8220;final say&#8221; regarding difficult decisions, but I also believe that the most successful and most efficient individuals in the positions never use that &#8220;final say&#8221; (many others, of course, fall victim to the temptation to use it often which usually in my experience quickly devolves to what Joseph Smith referred to as &#8220;unrighteous dominion&#8221;).  The best decisions are mutual decisions where all involved are respected equally.  This seems to be how the highest councils of the LDS Church usually are run.</p>
<p>Thus, to me, statements like &#8220;The priesthood does not have the strength that it should have and will not have until the power of the priesthood is firmly fixed in the families as it should be&#8221; are troubling to me.  What &#8220;power&#8221; of the priesthood is to be expressed within a family?  The first answer that comes to mind is the ability of the father to directly request blessings and miracles of God for his family, to perform rituals involving members of his family like baptism and the Gift of the Holy Ghost, or to pass on this authority to his sons.  That&#8217;s always a nice thing, in my mind, for a father to offer because at our present point in history, he is the only one with the authority to do so in the home.  To me, while the authority is divine, it&#8217;s no different than if the mother of the home had a bank account of her own with large amounts of funds that she could give to members of her family, including her husband, whenever it was requested (and that, for some unknown reason she was not allow to jointly co-own and operate with her husband).  If done in a spirit of generosity and love, without the mother feeling somehow important or entitled due to her ownership of such an account, the sharing of such funds as gifts could help the family to grow together.  Of course, if she were concerned about keeping an egalitarian relationship between herself and her husband or children she might not want to make too much use of her bank account.  In a similar fashion, I know of many men, myself included, who don&#8217;t actually enjoy giving blessings or other priesthood rituals in the home too often because it can be difficult to preserve the particular level of equality that the spousal partnership has currently achieved.  However, since such gifts and rituals can be used to strengthen family relationships when done with the right spirit, I would agree that men in the Church, myself included, need to do more of them for the families to which we belong.</p>
<p>However, this idea of the father stepping up in regards to what he has to offer to the family does <i>not</i> seem to be simply what President Packer has in mind.  Later statements about how it is a father&#8217;s right and duty to preside in the home are certainly much more than an offering of generosity and love.  &#8220;The priesthood does not have the strength that it should have and will not have until the power of the priesthood is firmly fixed in the families as it should be.&#8221;  Again, what does this phrase &#8220;power of the priesthood&#8221; mean?  From a note made during the talk (there is no transcript yet, so this may be flavored by thoughts I was having while watching) &#8220;The father presides at the table, in family prayer, and in general instruction to the family.  When he is present, he is presiding.&#8221;  It seems to me that President Packer is calling on men to lead and run their families in all settings , even informal things Family Home Evening and other events.</p>
<p>He shared a story where a young man had requested to be ordained to a higher level of the priesthood by an individual that was not his father.  We as an audience were given no context for that decision, and were even told later that the young man&#8217;s brothers had also previously requested to not have their father involved in their ordinations.  The moral of the story was clear, however: it didn&#8217;t matter <i>why</i> the father&#8217;s sons did not want him involved, he <i>deserved</i> to be involved because he was <b>the father</b>.  He had the <i>right</i> because he had contributed his Y chromosomes to their genetic makeup (my words, obviously).  It was later related that the forced ordination by the father had indeed resulted in a better relationship between father and son; it can&#8217;t be denied, this was a touching end to the story, but for all we know it could have ended just as easily that the young man felt that his reasons for not choosing his father were seen as pointless and, upon feeling that his input was completely ignored, descended into apathy in regards to his place within the Church.  In the end, the decision was not forced because of love.  The moral of the story was all about respect for authority, and respect for maleness specifically.  It wasn&#8217;t even about respect for the priesthood, since the story implied that the father should be involved in the ordination even if he didn&#8217;t have the authority to be involved (it was jokingly implied that, in such a case, he would be given such authority on the spot as a sort of &#8220;military commission&#8221;).</p>
<p>And what is the responsibility of women in regards to Pres. Packer&#8217;s plea for men to step it up in using the &#8220;power&#8221; of the priesthood in the home? &#8220;Unless we enlist the attention of the mothers and daughters and sisters, who have influence on their husbands, fathers, sons and brothers, we cannot progress. The priesthood will lose great power if the sisters are neglected.&#8221;  Personally, I think that the female members of my own family have <i>far</i> more to give to our family than &#8220;attention&#8221; and &#8220;influence&#8221;.  Certainly, Heidi can (and does) request blessings using the priesthood in her home, but that is <i>not</i> all that she can do in terms of creating a home that can be shielded from harm.  &#8220;You [Fathers] have the power of the priesthood directly from the Lord to protect your home. There will be times when all that stands as a shield between your family and the adversary&#8217;s mischief will be that power.&#8221;  I cannot agree with this prediction; the shield is that <i>we</i>, as parents (plural, not gendered), can raise our children to be moral agents that can choose, as we can choose individually and unitedly, to resist immorality and &#8220;mischief&#8221;.  If the use of priesthood in the home can be a bonding agent to help increase trust, love, and respect among all of us, so much the better.  But it is only one ingredient among many for a strong home and family.  The better ingredients have been what is available to all families, both within and without the LDS Church: love, respect, and kindness.</p>
<p>In total, President Packer&#8217;s call for men to step up in employing their authority in both the Church and the home, was severely limiting for members of the Church who do not have the priesthood.  Which, if you&#8217;ll recall again, is the vast majority of Church members.  It was a call for the minority to assert their authority and a call for the majority to assist and aid them in doing so.  I felt that the entire talk was a missed opportunity to not simply empower those few men within the Church who have the priesthood, but instead call for all members of the Church to step it up in striving to obtain miracles and blessings from God.  While the priesthood is authority that is currently limited to men, a call to live up to the power available to us as children of God is a call that anyone can answer.</p>
<p class="intro">All of this is why I appreciated so much the next talk by President Julie Beck, personally applying it somewhat as a corollary to the previous talk.  My issue with President Packer&#8217;s talk came from my trying to apply generally the principles he was discussing to members of the Church as a whole; much of what he said simply cannot apply to the majority of church members.  However, all of what President Beck spoke about is applicable to all members of the Church.  She spoke of women in the church increasing faith, strengthening families, and providing relief.  And she spoke of the power that can help women in accomplishing these goals: personal revelation.  In discussing this, she was appealing to the personal and individual communication available to all individuals.  To President Beck, the divine power available to women (and men, I would add) is a power that comes to them directly from God.  Women are not dependent upon men to provide them with power: they have it by virtue of their personal relationship with God and their ability to listen to the revelatory promptings of God&#8217;s Spirit.  Women don&#8217;t need men to tell them when they are doing well; she proclaimed that women should be women, not babies to be petted and corrected all the time. &#8220;We know we are successful if we live so that we qualify for, receive, and know how to follow the Spirit&#8221;.</p>
<p>President Beck was also exhorting the women of the Church to step it up: &#8220;In my visits with the sisters, I have felt that there has never been a greater need for increased faith and personal righteousness. There has never been a greater need for strong families and homes. There has never been more that could be done to help others who are in need&#8230; When Relief Society functions in an inspired way, it lifts women up and out of a troubled world and into a way of living that prepares them for the blessings of eternal life&#8230; Through Relief Society, sisters can receive answers to their questions and be blessed by the combined spiritual power of all the sisters.&#8221;  Now, I&#8217;m not sure what was meant by &#8220;through Relief Society&#8221; in that statement, but the combined efforts of many people can be a powerful force indeed.  In calling upon the sisters to do better, she told them that &#8220;We are doing well when we increase faith and personal righteousness, strengthen families and homes, and seek out and help others who are in need.&#8221;  There was little from her remarks that was not equally applicable to any member of the Church, or, indeed, any member of another faith entirely.  Her talk was not limiting at all, even though it was addressed only to the women of the Church.  It was empowering and ennobling counsel that applied to everyone who was listening.</p>
<p class="intro">Indeed, these two points of view were present throughout the Conference to varying degrees.  At times the exhortations to rely upon divine power was limited to those of the Priesthood, while at other times the same exhortation was given to everyone.  Since the majority of Church membership is composed of individuals without Priesthood authority, I felt it was far better to speak to the Church as a whole.  Especially since the Priesthood have their own semi-private session of General Conference (semi because I can&#8217;t imagine that anyone would ask a sister in attendance to leave).  Why give a talk addressed to the Priesthood to the general membership in the first place?  Especially one that seemed to be about so much more than wives requesting that their husbands offer and be involved in more blessings and ordinances to members of the family?  I don&#8217;t have much of an answer.</p>
<p class="intro">TL;DR;<br/>President Packer&#8217;s talk, while not saying anything negative in particular, was limiting in its aspect, target audience, and application.  It was empowering to the few.  President Beck&#8217;s talk, while also not a paragon of egalitarian thought, was unlimited in aspect, audience, and application.  It was empowering to all.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/04/packer-beck-conference-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Faux-Wordpress Plugin Note II</title>
		<link>http://blog.doggetto.com/2010/03/faux-wordpress-note-ii/</link>
		<comments>http://blog.doggetto.com/2010/03/faux-wordpress-note-ii/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 19:02:10 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[symfony Framework]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=593</guid>
		<description><![CDATA[Okay, I think I&#8217;ve got the repository nonsense worked out.
Feel free to checkout or browse the code at:
https://svn.xp-dev.com/svn/tpdFauxWPPlugin/trunk/
As I said, I&#8217;m still working on this, so be careful: the code might not actually be working all the time.  Feel free to read the logs for more info, I try to at least type something [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, I think I&#8217;ve got the repository nonsense worked out.</p>
<p>Feel free to checkout or browse the code at:<br />
<a href="https://svn.xp-dev.com/svn/tpdFauxWPPlugin/trunk/">https://svn.xp-dev.com/svn/tpdFauxWPPlugin/trunk/</a><span id="more-593"></span></p>
<p>As I said, I&#8217;m still working on this, so be careful: the code might not actually be working all the time.  Feel free to read the logs for more info, I try to at least type something when I commit.</p>
<p>For those who are interested in how to convert your project into a plugin, it&#8217;s actually quite simple.  A plugin is like a little mini-application: it holds a lib directory for filters, forms, and models; it holds a modules directory for modules (these have to be explicitly activated in each application); and it can hold other directories like web and config.  Each of these directories functions the same as in a full application.  One nice thing a lot of plugin developers will do is to add a third layer of inheritance above the plugin model classes so that future developers can extend the plugin without having to muck about inside of the plugin code  (You might have seen this if you&#8217;ve played around with sfGuard:  the normal model classes are all empty and extend the Plugin classes which extend the base classes).</p>
<p>Anyways, gather all of that together, and you have the directory structure of a plugin, ready to be used in Symfony.  As for the actually business of packaging I&#8217;ll have to leave that for later.  It can be very simple, but to pull off some really cool things requires a bit of work.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/03/faux-wordpress-note-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Producing a Faux-Wordpress Plugin for Symfony, Part IV</title>
		<link>http://blog.doggetto.com/2010/03/producing-a-faux-wordpress-plugin-for-symfony-part-iv/</link>
		<comments>http://blog.doggetto.com/2010/03/producing-a-faux-wordpress-plugin-for-symfony-part-iv/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 17:27:04 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[symfony Framework]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=589</guid>
		<description><![CDATA[I really want to finish this plugin.  I'm getting a little tired of using two solutions for my website and I want to get back to working on other things I've planned.  So instead of giving everyone the play-by-play for the application (which has been taking FOREVER), I'm going to give status updates on the project, open up a subversion repository, and just start building the applicaiton]]></description>
			<content:encoded><![CDATA[<p class="intro>For this fourth part of my post on my FauxWordPress plugin I am changing tack.  Previously I&#8217;ve actually been developing at the exact same time as writing.  This meant that, in essense, I was writing everything twice, then testing, then writing everything twice again, then testing, and finally writing everything twice again.  I guess this was really fun for people who were trying to follow along from scratch, but there&#8217;s already plenty of good tutorials that help in the development of a full application (Askeet, Jobeet).  Besides, while there are aspects of plugin development that I had to somewhat struggle with, it was better for me to struggle because I think I&#8217;ve learned more that way (still learning).<span id="more-589"></span></p>
<p class="intro">I really want to finish this plugin.  I&#8217;m getting a little tired of using two solutions for my website and I want to get back to working on other things I&#8217;ve planned.  So instead of giving everyone the play-by-play for the application (which has been taking FOREVER), I&#8217;m going to give status updates on the project, open up a subversion repository, and just start building the applicaiton.  At certain points along the way I&#8217;ll give posts about certain aspects of the development process that you should keep in mind for application development.</p>
<p>I&#8217;ve been swaped the past month with work and school so development on this plugin was somewhat slow.  I have finished up my plans for spam checking, however.  Considering that this is, basically, version 1 I&#8217;ve not written it very well in terms of adding additional spam solutions, but for now there is a Spam class that contains some abstracted functions for spam checking.  These functions basically run other functions within the class based upon config variables.  Currently there are functions to handle either Akismet or TypePad AntiSPam; I cheated because technically TypePad uses the same API calls as Akismet.  Two for the price of one!  If no spam solution is specified in the app.yml config file, then all comments are automatically approved.  I have still not added Mollum spam checking because it doesn&#8217;t return a straight-up boolean response but will, if unsure of the comment&#8217;s status after an initial check, present the user with a CAPTCHA field.  This sort of two-step process will be a little more involved and I&#8217;ll need to see about implementing it later.  For now, however, spam collection with two different checking solutions is finished.</p>
<p>Next to work on is the Show View for posts.  I want, as stated before, to allow the displaying and listing of posts (basically the entire post module for the frontend) to use any sort of Wordpress theme.  I will be continuing to push for this goal after cleaning up the subversion repository.</p>
<p class="intro">Which brings me to my final bit of news.  I suck at subversion; I may use the CLI for it, but it you were to ask me to merge two branches to the trunk or something standard like that, I&#8217;d say get someone else.  I&#8217;m good at checking code out and checking code in.  Producing branches and trunks?  Not so good at that, but I need to learn.  To do so, I&#8217;ll be spending a bit of time today cleaning up my project repository and working copy in case anybody wants to check anything out.  Currently I&#8217;m still developing a full-blown application and not a plugin; converting from a project to a plugin isn&#8217;t that hard, so I&#8217;ll probably spend some time converting it and continue development as a plugin.  The benefit is that if anyone wants to try out this unfinished plugin, or offer any suggestions, they&#8217;ll be able to checkout code themselves.  I&#8217;ll post the URL of the repository as soon as I get it all figured out.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/03/producing-a-faux-wordpress-plugin-for-symfony-part-iv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faux-Wordpress Plugin Note I</title>
		<link>http://blog.doggetto.com/2010/02/faux-wordpress-note/</link>
		<comments>http://blog.doggetto.com/2010/02/faux-wordpress-note/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 20:00:11 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=585</guid>
		<description><![CDATA[This is mostly just for my own notes, because this will come up later in the project.
To allow a plugin for spam modification in my plugin, I need to abstract out a few things:
The comment to be posted is given to an abstract checking function.  This checking function in turn calls the plugin&#8217;s checking [...]]]></description>
			<content:encoded><![CDATA[<p>This is mostly just for my own notes, because this will come up later in the project.<span id="more-585"></span></p>
<p>To allow a plugin for spam modification in my plugin, I need to abstract out a few things:<br />
The comment to be posted is given to an abstract checking function.  This checking function in turn calls the plugin&#8217;s checking function. (This is like the sfGuard login function which can either run default or turn over login functionality to another function for such things as LDAP login).</p>
<p>The plugin has a few options for how it responds, all of which I should try to allow for:
<ol>
<li>It will set the comment as ham</li>
<li>It will set the comment as spam</li>
<li>It will run a secondary process to determine the humanity of the poster</li>
</ol>
<p>After the comments are automatically dealt with, the user may change the results somewhat.  The plugin will probably want to report on these changes.
<ol>
<li>User changed spam to ham (incorrectly marked as spam)</li>
<li>User changed ham to spam (incorrectly marked as ham)</li>
</ol>
<p>There are probably three spam filters that I would make use of:
<ul>
<li><a href="http://akismet.com/development/">Akismet</a></li>
<li><a href="http://antispam.typepad.com/info/developers.html">Typepad AntiSpam</a></li>
<li><a href="http://mollom.com/api">Mollum</a></li>
</ul>
<p>I should focus on these three and make certain that each one of them can be turned off/on with nothing more than changing the app&#8217;s config file.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/02/faux-wordpress-note/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Producing a Faux-Wordpress Plugin for Symfony, Part III</title>
		<link>http://blog.doggetto.com/2010/02/producing-a-faux-wordpress-plugin-for-symfony-part-iii/</link>
		<comments>http://blog.doggetto.com/2010/02/producing-a-faux-wordpress-plugin-for-symfony-part-iii/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 19:30:24 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[symfony Framework]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=555</guid>
		<description><![CDATA[To build this plugin I&#8217;m going to start with a new project, entirely from scratch.  This means that I will be initially developing a normal application.  Once we&#8217;re nearing the end, we&#8217;ll package the project up into a plugin.  This post will cover the development of basic CRUD functionality so we can [...]]]></description>
			<content:encoded><![CDATA[<p>To build this plugin I&#8217;m going to start with a new project, entirely from scratch.  This means that I will be initially developing a normal application.  Once we&#8217;re nearing the end, we&#8217;ll package the project up into a plugin.  This post will cover the development of basic CRUD functionality so we can actually <em>do</em> something if we want.<span id="more-555"></span></p>
<p>To start off, we&#8217;ll need our database and web server set up and ready to go.  I won&#8217;t go into that now and will just assume that you have config/databases.yml and config/propel.ini both set up and ready to go.  I also enjoy setting a VirtualHost in apache to handle the application, but that sort of choice is up to you.  It won&#8217;t matter to the packaged plugin in the end what you name the development database or how to configure your server.</p>
<p>We&#8217;ll need to have sfGuardUserPlugin installed because there are a few references to it in the schema of the previous post.  Let&#8217;s install it now before we set up the database tables.</p>
<div class="box"><code>symfony plugin:install sfGuardPlugin;</code></div>
<p>Now that we have sfGuard installed, we should be ready to build the application.</p>
<div class="box"><code>symfony propel:build-all --no-confirmation;</code></div>
<p>The schema is established in the database and we&#8217;re ready to go.</p>
<p>Let&#8217;s establish a few generators to take care of data entry.  For now, let&#8217;s establish one for managing posts and managing comments.</p>
<div class="box"><code>symfony propel:generate-admin --module="post" frontend sfFauxWPPost;<br />
symfony propel:generate-admin --module="comment" frontend sfFauxWPComment;</code></div>
<p>Next let&#8217;s set up the post module as the default module (for now) for the frontend, and set up links to the two modules in the template.</p>
<div class="box"><strong>/apps/frontend/config/routing.yml:</strong><br />
<code>...<br />
# default rules<br />
homepage:<br />
&nbsp;&nbsp;url:   /<br />
&nbsp;&nbsp;param: { module: post, action: index }<br />
...</code></div>
<div class="box"><strong>/apps/frontend/templates/layout.php:</strong><br />
<code>...<br />
&nbsp;&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;&lt;?php echo link_to('Posts', '@sf_faux_wp_post') ?&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;&lt;?php echo link_to('Comments', '@sf_faux_wp_comment')?&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo $sf_content ?&gt;<br />
&nbsp;&nbsp;&lt;/body&gt;<br />
...</code></div>
<p>Now, after cleaing the cache (<code>symfony cc;</code>) we should be able to load the application and see the Post module.  It&#8217;s rather messy, however, since there is a <em>large</em> fitler box on the side and no default data to look at.  Also, if we try to click on the &#8220;Comments&#8221; link we&#8217;ll get a failure because there is no &#8220;__toString&#8221; function for Posts.  Let&#8217;s fix this first of all since we&#8217;ll be needing to echo objects a lot in this project.</p>
<p>The following are the objects that we&#8217;d expect to produce a string when echoed.  As for the others, feel free to add a __toString if you want.  We&#8217;ll probably address these objects later.  I am including phpDoc documentation in the functions because I want to have a correctly defined tooltip in NetBeans whne I reference this function.</p>
<div class="box"><strong>/lib/model/sfFauxWPCategory.php:</strong><br />
<code>&lt;?php
<p>class sfFauxWPCategory extends BasesfFauxWPCategory<br />
{<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;* Echos the name of the category.<br />
&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;* @return     string<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public function __toString()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;getName();<br />
&nbsp;&nbsp;}<br />
}</code></div>
<div class="box"><strong>/lib/model/sfFauxWPComment.php:</strong><br />
<code>class sfFauxWPComment extends BasesfFauxWPComment<br />
{<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;* Echos the content of the comment.<br />
&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;* @return     string<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public function __toString()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;getContent();<br />
&nbsp;&nbsp;}<br />
}<br />
</code></div>
<div class="box"><strong>/lib/model/sfFauxWPPost.php:</strong><br />
<code>&lt;?php
<p>class sfFauxWPPost extends BasesfFauxWPPost<br />
{<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;* Echos the title of the post.<br />
&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;* @return     string<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public function __toString()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;getTitle();<br />
&nbsp;&nbsp;}<br />
}</code></div>
<div class="box"><strong>/lib/model/sfFauxWPTag.php:</strong><br />
<code>&lt;?php
<p>class sfFauxWPTag extends BasesfFauxWPTag<br />
{<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;* Echos the name of the tag.<br />
&nbsp;&nbsp;&nbsp;*<br />
&nbsp;&nbsp;&nbsp;* @return     string<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;public function __toString()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;getName();<br />
&nbsp;&nbsp;}<br />
}</code></div>
<p>Now the basic CRUD functions for both Posts and Comments should be working.  Finally, before we end for now, let&#8217;s establish a &#8220;show&#8221; view for posts.</p>
<div class="box"><strong>/apps/frontend/modules/post/actions/actions.class.php:</strong><br />
<code>&lt;?php
<p>/**<br />
&nbsp;* post actions.<br />
&nbsp;*<br />
&nbsp;* @package    PhpProject1<br />
&nbsp;* @subpackage post<br />
&nbsp;* @author     Your name here<br />
&nbsp;* @version    SVN: $Id: actions.class.php 12474 2008-10-31 10:41:27Z fabien $<br />
&nbsp;*/<br />
class postActions extends autoPostActions<br />
{<br />
&nbsp;&nbsp;public function executeShow(sfWebRequest $request)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;sf_faux_wp_post = $this-&gt;getRoute()-&gt;getObject();<br />
&nbsp;&nbsp;}<br />
}</code></div>
<div class="box"><strong>/apps/frontend/modules/post/templates/showSuccess.php:</strong><br />
<code>&lt;?php use_helper('I18N', 'Date') ?&gt;<br />
&lt;?php include_partial('post/assets') ?&gt;
<p>&lt;div id="sf_admin_container"&gt;<br />
&nbsp;&nbsp;&lt;h1&gt;&lt;?php echo __($sf_faux_wp_post->getTitle(), array(), 'messages') ?&gt;&lt;/h1&gt;</p>
<p>&nbsp;&nbsp;&lt;div id="sf_admin_content"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="sf_faux_wp_published_at"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo $sf_faux_wp_post-&gt;getPublishedAt(); ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="sf_faux_wp_content"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo __(nl2br($sf_faux_wp_post-&gt;getContent())); ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;hr/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="comments"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="comment_count"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo ($sf_faux_wp_post-&gt;countsfFauxWPComments() ? $sf_faux_wp_post-&gt;countsfFauxWPComments() : "No") ?&gt; Comment&lt;?php echo ($sf_faux_wp_post-&gt;countsfFauxWPComments() != 1 ? 's' : '')  ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php foreach($sf_faux_wp_post-&gt;getsfFauxWPComments() as $id =&gt; $comment):?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="comment_&lt;?php echo $id ?&gt;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="comment_name_&lt;?php echo $id ?&gt;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo __($comment-&gt;getWebsite() ? link_to($comment-&gt;getAuthor(), $comment-&gt;getWebsite()) : $comment->getAuthor()) ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id="comment_content_&lt;?php echo $id ?&gt;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php echo __($comment-&gt;getContent()) ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;?php endforeach; ?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&lt;/div&gt;<br />
&lt;/div&gt;</code></div>
<p>That&#8217;s enough for today.  Dang, I never expected that writing these posts would slow down the development so much.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/02/producing-a-faux-wordpress-plugin-for-symfony-part-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Producing a Faux-Wordpress Plugin for Symfony, Part II</title>
		<link>http://blog.doggetto.com/2010/02/producing-a-faux-wordpress-plugin-for-symfony-part-ii/</link>
		<comments>http://blog.doggetto.com/2010/02/producing-a-faux-wordpress-plugin-for-symfony-part-ii/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 00:00:06 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[symfony Framework]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=524</guid>
		<description><![CDATA[The Symfony framework is awesome (and well-suited, I'd argue, for such an endeavor whenever someone wishes to attempt it), but it is meant for PHP developers, not for somebody who just wants to host a blog to talk about ecclesiology(!).  So, my plugin will approach the issue from this point of view: the PHP developer.  Wordpress plugins extend Wordpress to act however the developer wants; with a real Wordpress install all needs for the website are meant to really be handled by Wordpress.  With my plugin, it is really just a plugin to handle and emulate the <em>blogging</em> aspects of Wordpress; for the other features that a user or developer might want you'll need to address those through the framework itself.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.caerdelyn.co.uk/photos.html"><img alt="Working on the Foundations" title="Working on the Foundations" class="content-img-right" src="/wp-content/uploads/w_foundation.jpg" height="200" width="240"></a>
<p class="intro">Wordpress is, by far, the most popular blogging framework on the Internet today and that popularity is not undeserved.  It has an easy installation and is set up to cater to non-technical people.  After installation, it simply works and people are up and running quickly.  It has an active plugin community to extend it in any direction a user might need.  In short, it&#8217;s a great solution to use pretty much anywhere.</p>
<p>However, it&#8217;s also not very nice to play with as a developer.  The code is mostly based around PHP 4 (although that will probably change when 3.0 is released) and writing plugins and themes can occasionally be a nightmare.  Security is, unfortunately, a constant problem since the ease-of-use is occasionally in tension with secure practices.  Finally, while the self-contained aspect of Wordpress is great for a typical user who pretty much runs their entire site through Wordpress, integrating a Wordpress installation with an existing applicaiton &#8212; especially an application that has its own extensive user-management solution &#8212; is a daunting task.<span id="more-524"></span>  Wordpress is a streamlined applicaiton, but trying to bend it in ways it wasn&#8217;t meant to bend (fiddling with database schemas, login and session management, etc) often breaks either Wordpress or the developer.</p>
<p>The symfony plugin I am trying to write is NOT to somehow <em>replace</em> Wordpress.  That is a large project that would be nearly impossible for myself.  I have no idea how I&#8217;d ever compete against the easiness of a Wordpress installation.  The Symfony framework is awesome (and well-suited, I&#8217;d argue, for such an endeavor whenever someone wishes to attempt it), but it is meant for PHP developers, not for somebody who just wants to host a blog.  So, my plugin will approach the issue from the PHP developer&#8217;s point of view.  Wordpress plugins extend Wordpress to act however the developer wants; with a Wordpress installation all functions of the website are meant to be handled by Wordpress.  With my plugin, it is just a plugin to handle and emulate the <em>blogging</em> aspects of Wordpress; for the other features that a user or developer might want you&#8217;ll need to address those through the framework itself.  Anything that isn&#8217;t the job of a blogging solution (e.g., a contact page) isn&#8217;t done by the blogging solution.</p>
<p>So, with that out of the way, on to building the plugin (which, until I think of a better name, is called sfFauxWP).</p>
<p class="intro">The foundation of any blogging solution revolves around the basic idea of posts and comments.  The following schema (adapted from the already excellent <a href="http://www.symfony-project.org/plugins/sfSimpleBlogPlugin">sfSimpleBlogPlugin</a>) allows for posts, comments, tags (non-self-referential post attributes), categories (self-referential post attributes), and user ratings.  There are a number of booleans which hold post-specific settings regarding user interaction.  While allowing some room for possible modification in the future, this schema is probably more than enough for our needs.</p>
<h3>schema.yml</h3>
<p><code style="line-height: 1em; font-size: medium;"><strong>propel</strong>:<br />
&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>package</strong>: lib.model<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>defaultIdMethod</strong>: native<br/><br />
<em>## Posts ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_posts</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPPost<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>author_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_guard_user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>title</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: varchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>size</strong>: 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>short_title</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: varchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>size</strong>: 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>summary</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: longvarchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>content</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: longvarchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>is_published</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>default</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>restrict_comments</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>default</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>rate_comments</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>default</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>rate_posts</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>default</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>published_at</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: date<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_uniques</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>short_title_published_at</strong>: [short_title, published_at]<br/><br />
<em>## Comments ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_comments</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPComment<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>sf_faux_wp_post_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_posts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>sf_guard_user_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_guard_user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>author</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: varchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>size</strong>: 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>email</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: varchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>size</strong>: 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>website</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: varchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>size</strong>: 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>content</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: longvarchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>is_moderated</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: boolean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>default</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## Tags ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_tags</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPTag<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>name</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: varchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>size</strong>: 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>index</strong>: unique<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## Categories ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_categories</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPCategory<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>parent_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_posts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: set null<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>name</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: varchar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>size</strong>: 255<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>index</strong>: unique<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## The Post<=>Tag Relationship ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_post_tags</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPPostTag<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>post_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_posts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>tag_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_tags<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_uniques</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>post_tag</strong>: [post_id, tag_id]<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## The Post<=>Category Relationship ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_post_categories</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPPostCategory<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>post_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_posts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>category_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_tags<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: set null<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_uniques</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>post_category</strong>: [post_id, category_id]<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## The Post Group Controls - Who Can Comment? ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_post_groups</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPPostGroup<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>post_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_posts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>group_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_guard_group<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## The Category Group Controls - Who Can Create? ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_category_groups</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPCategoryGroup<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>category_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_tags<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>group_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_guard_group<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## The User Ratings for Comments ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_comment_user_ratings</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPCommentUserRating<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>comment_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_comments<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>user_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_guard_user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>rating</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: tinyint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>default</strong>: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~<br/><br />
<em>## The User Ratings for Posts ##</em><br />
&nbsp;&nbsp;<strong>sf_faux_wp_post_user_ratings</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>_attributes</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>phpName</strong>: sfFauxWPPostUserRating<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>primaryKey</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>autoIncrement</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>post_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_faux_wp_posts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>user_id</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>required</strong>: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignTable</strong>: sf_guard_user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>foreignReference</strong>: id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>onDelete</strong>: cascade<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>rating</strong>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>type</strong>: tinyint<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>default</strong>: 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>created_at</strong>: ~<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong>updated_at</strong>: ~</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/02/producing-a-faux-wordpress-plugin-for-symfony-part-ii/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Producing a Faux-Wordpress Plugin for Symfony, Part I</title>
		<link>http://blog.doggetto.com/2010/01/producing-a-faux-wordpress-plugin-for-symfony-pat-i/</link>
		<comments>http://blog.doggetto.com/2010/01/producing-a-faux-wordpress-plugin-for-symfony-pat-i/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 01:30:01 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[symfony Framework]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=485</guid>
		<description><![CDATA[So, for the past year or so I have struggled in trying to figure out how best to incorporate Wordpress into a Symfony application.  The conclusion I have come to?  I'm really starting to wonder if it's worth any of the trouble.  So, I'm trying to figure out, for myself at least, what aspects of Wordpress I really appreciate; of those features, I really wonder whether or not building a new plugin (or extending sfSimpleBlogPlugin/sfBlogsPlugin) would not be a better idea.]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/printing_press.jpg" alt="Printing Press" title="Printing Press" width="250" height="150" class="content-img" />
<p class="intro">So, for the past year or so I have struggled in trying to figure out how best to incorporate Wordpress into a Symfony application.  The conclusion I have come to?  I&#8217;m really starting to wonder if it&#8217;s worth any of the trouble.  So, I&#8217;m trying to figure out, for myself at least, what aspects of Wordpress I really appreciate; of those features, I really wonder whether or not building a new plugin (or extending sfSimpleBlogPlugin/sfBlogsPlugin) would not be a better idea.<span id="more-485"></span></p>
<p>I have not yet started on this project, so to decide whether it&#8217;s worthwhile, what are the aspects of Wordpress (or just blog administration in general) that I really enjoy and would like to see in any other solution?</p>
<ol>
<li>
<p><strong>Themes</strong><br/>The multiplicity of Wordpress themes is a great example of how extendible the blogging framework is.  Just download it, select it, and you&#8217;re good to go.  I would love, with a Symfony solution, to be able to define a theme in a config file (or even in the admin backend, as is done with Wordpress) and have it display.  Or choose to use the application template default instead.  Whatever solution I come up with, I would love for it to be able to accomodate existing Wordpress themes <em>without</em> any extensive reworkings (plug and play would be ideal).</p>
</li>
<li>
<p><strong>Spam Collection/Akismet</strong><br/>Wordpress makes good use of the Akismet spam prevention filters.  My solution would have to make use of these prevention techniques as well.  It&#8217;d be great to figure out how to make use of ReCAPTCHA, but your avergae blog nowadays usually depends upon active filtering and I want my solution to seem like any other typical blog.</p>
</li>
<li>
<p><strong>Scheduling and Drafting of Posts</strong><br/>I <em>love</em> the ability in Wordpress of drafting and publishing against a future date.  The ability to view these drafts or, if logged in, to see to-be-published posts is needed.</p>
</li>
<li>
<p><strong>Pingbacks</strong><br/>It&#8217;s just good blogging ettiquete to pingback to other blogs.  My pingback solution should work correctly with existing blogging frameworks.</p>
</li>
<li>
<p><strong>RSS Feeds</strong><br/>I&#8217;d like to deliver post/comment feeds for the entire blog as well as individual posts.</p>
</li>
<li>
<p><strong>Media Library</strong><br/>Having pictures and audio (and YouTube code) available for blog posts is made much easier when you&#8217;re confident that they are on the server and available for use.  An effective Media Library would be nice.  On the frontend, it might even be cool to put together some sort of slide-show option (although that might be more work than I need right now).</p>
</li>
<li>
<p><strong>Twitter Integration</strong><br/>I haven&#8217;t yet figured out the best way to use Twitter, but it&#8217;d be nice to be able to simul-publish a post along with a custom/default Twitter announcement and link.  Perhaps it&#8217;d also be cool to pull in Twitter posts as a sort of specialized blogroll.</p>
</li>
<li>
<p><strong>Categories/Tags</strong><br/>Having a branching tree of categories is a very nice aspect of modern blog frameworks.  I would love to be able to filter the posts based on multiple categories (not that I actually plan on writing so many posts to make that particular feature needful, but it&#8217;d be nice to have).  Deleting a category should, in my mind, simply move all of the posts up to belong to the category parent (if it exists).</p>
</li>
<li>
<p><strong>Wysiwyg Editor</strong><br/>The user should be able to set whether they wish to have the Wysiwyg editor or the source editor as their default &#8211; I use source almost all of the time and to have that be default for myself would be great.  The Wysiwyg Editor should be fast and user-friendly.</p>
</li>
<li>
<p><strong>Gravatars</strong><br/>If allowed by the theme, the use of gravatars would be very nice indeed.  I always enjoy having my avatar at a blog be personalized without me having to do anything.</p>
</li>
<li>
<p><strong>Word Count</strong><br/>I like knowing how many words are on a post, or a post summary.</p>
</li>
<li>
<p><strong>Reddit-style Like/Dislike</strong><br/>I absolutely hate having trolls on some of the blogs I go to, but it&#8217;s too easy to feed to trolls when all you want to do is get rid of them.  Being able to both like and dislike posts and comments would be a great way to users to be involved both with the blog and with each other (obviously, this should be restricted on a post-by-post basis to view-by-all, by-specified-groups, or by-none; or you could just turn the feature off on some posts).</p>
</li>
<li>
<p><strong>Protected Posts and Access Control</strong><br/>Yeah, this starts to blur the line between forum and blog, but to be honest, there are some blog posts where I&#8217;d love to prevent the entire Internet from looking at them.  I&#8217;d love to protect posts either by a defined password or even by user levels (sfGuard would work great for this).  Perhaps even apply these permissions to the categories/tags to automatically assign protection to posts.</p>
</li>
<li>
<p><strong>Ajax</strong><br/>In another word: bling.  I want the backend and the frontend to be a little easier to use by default and look nice.  Symfony includes support for a number of good Javascript libraries.</p>
</li>
<li>
<p><strong>Configuration</strong><br/>There are two levels of configuration that would be available to this solution: there would be the administrative options like themes, spam control, and others.  However there are application options that are also important:  use ajax or not?  use feeds or not?  These are things that are likely just set once and never set again.  As such, who cares if they are removed from the user and are placed into a symfony configuration file?  Simplifying the backend by not placing EVERYTHING in it would go a long way in my opinion, so I will need to define what I feel should be configurable by the user and I will also need to define WHERE they can configure it.</p>
</li>
</ol>
<p>Things I do not need:</p>
<ol>
<li>
<p><strong>Pages</strong><br/>Since we&#8217;re NOT using Wordpress to handle everything, any other pages could be handled by adding a module to the application.</p>
</li>
<li>
<p><strong>Cache</strong><br/>I know that symfony caching could be a lot better, but it&#8217;s still pretty good and it&#8217;s standard in the framework.  I don&#8217;t see a need to add it.</p>
</li>
<li>
<p><strong>Contact Forms</strong><br/>We&#8217;re working with an entire framework here, complete with the idea that we&#8217;ll be delivering other content besides a blog.  If I were going to provide a complete blogging solution simply based on symfony (instead of a plugin), then this would make sense.  But in regards to this plugin, if you want a contact page, build it yourself!</p>
</li>
</ol>
<p>Things I think would be plain awesome but have no clue how:
<ol>
<li>
<p><strong>Gears or HTML5</strong><br/>Using Google Gears is an awesome way of interacting with a web application.  Wordpress has the ability to interact with Gears for the backend area &#8211; this speeds things up IMMENSELY.  However, Google has publicly announced with the advent of Google Wave that they really don&#8217;t see a future for Gears when all of their needs can be handled with tools in HTML5.  It would be awesome to beat Wordpress to the gate by somehow implementing HTML5 tools to help speed up the backend (or possibly even the frontend).</p>
</li>
<li>
<p><strong>Alternate Login Options for Admin and Comments</strong><br/>  This is more of an issue regarding sfGuardUser, but it would be fantastic to allow a user to log into the site using FacebookConnect or OpenId.  If anything, it would allow for specific user preferences regarding comments.  This may be a bit of overkill for my own needs, but if I ever planned on opening a multi-user (or even, perhaps, a multi-blog) plugin I think this would be a great selling point.</p>
</li>
<li>
<p><strong>Mobile Solution</strong><br/>  Again, this may not be a strictly blogging feature, but it&#8217;d be nice to figure out how to deliver the application in a mobile format for Androids and iPhones.</p>
</li>
<li>
<p><strong>PHP Code within the Post</strong><br/>  This maye be the worst idea in the history of the world &#8211; to be honest it&#8217;s a security nightmare.  However, it&#8217;d be pretty awesome sometimes to not just dynamically serve posts, but to have the post content be dynamic.  It&#8217;d be fun to look further into this.</p>
</li>
<li>
<p><strong>Detailed Stats</strong><br/>  Keeping track of detailed visitor statistics would help in building some fun features (most/least popular posts, most/least popular comments, etc).</p>
</li>
<li>
<p><strong>iTunes/Podcasting Help</strong><br/>  It&#8217;d be great to ensure that you can deliver an accurate iTunes podcasting feed from the app without devoting every post to the podcast.</p>
</li>
</ol>
<p>In looking at this closely, almost all of it could be handled VERY easily by existing symfony plugins or could be created very easily.  There are a few difficulties, however, the largest of which is obviously the theme integration.  However, if I could get it to work (and I have a few ideas) then the largest reason for me to use Wordpress goes away and I can be happy in having a tightly integrated blogging solution available for my projects.</p>
<p>Over the next few weeks I will be working on trying to create this solution using the symfony framework.  I&#8217;ll try to document my progress and, hopefully, my success.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/01/producing-a-faux-wordpress-plugin-for-symfony-pat-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How I Use Netbeans 6.8 and Symfony 1.2</title>
		<link>http://blog.doggetto.com/2010/01/how-i-use-netbeans-6-8-and-symfony-1-2/</link>
		<comments>http://blog.doggetto.com/2010/01/how-i-use-netbeans-6-8-and-symfony-1-2/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 19:02:08 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[symfony Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=473</guid>
		<description><![CDATA[Recently, I found that Sun's Java-based IDE, NetBeans, had added symfony support and I wondered how useful that might be.  I tried it and loved it.  Using NetBeans is not without issues, however it's worked out quite well and I'd recommend giving it a try.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.stockvault.net/Food_Drink_g16-Coffee_beans_very_close_p13373.html"><img alt="Beans" title="Beans" class="content-img-right" src="/wp-content/uploads/coffee_beans.jpg" height="250" width="334"></a>
<p class="intro">I am expirementing with using a full-fledged IDE for web development at work.  Until recently I used gEdit; most people don&#8217;t know that gEdit can be extended via plugins to become a fantastic development environment.  However, one thing I could never get to work was auto-completion based upon functions and classes in PHP.  However, the speed of using gEdit, as opposed to Eclipse, was amazing and I never could quite get the hang of editors like Aptana and Eclipse.  Recently, I found that Sun&#8217;s Java-based IDE, NetBeans, had added symfony support and I wondered how useful that might be.  I tried it and loved it.  Using NetBeans is not without issues, however.  It&#8217;s still a bit buggy (that might be because I&#8217;m using the development code) and memory usage is about what you&#8217;d expect from a Java-based editor (ie, sometimes really, really high).  Still, it&#8217;s worked out quite well and I&#8217;d recommend giving it a try.<span id="more-473"></span></p>
<p>Here&#8217;s how I set up my installation of NetBeans.  I am running Ubuntu Karmic Koala (9.10).</p>
<blockquote><p><strong>1. Download Netbeans 6.8 for PHP from <a href="http://netbeans.org/">netbeans.org</a></strong><br />
<strong>2. Install to /opt/NetBeans</strong><br />
Run the following code to prep the installation directory:</p>
<blockquote style="color: black; font-size: larger;"><p><code>sudo mkdir /opt/NetBeans;<br />
sudo chmod 777 /opt/NetBeans;</code></p></blockquote>
<p>Then run the following from a terminal wherever you saved the NetBeans installation file:</p>
<blockquote style="color: black; font-size: larger;"><p><code>chmod +x &lt;netbeans_file&gt;.download;<br />
./&lt;netbeans_file&gt;.download;</code></p></blockquote>
<p>This will begin the installation.</p>
<p>Be certain to change the installation from your home directory to /opt/NetBeans!</p>
<p>NetBeans should install itself to the desktop as an icon and to the menu under &#8220;Programming&#8221;.  To uninstall it at any later time simply run:</p>
<blockquote style="color: black; font-size: larger;"><p><code>sh /opt/NetBeans/uninstall.sh;</code></p></blockquote>
<p>This will remove the program.  To fully remove it, also remove the configuration directories at: ~/.netbeans,  ~/.netbeans-registration, and ~/NetBeansProjects.</p>
<p><strong>3.Configure NetBeans.</strong><br />
symfony functionality was included in NetBeans 6.8 so it doesn&#8217;t require a plugin in this or later versions.  However, it does require some setup to work correctly.  Run Netbeans, and go to the Options dialogue (Tools &gt; Options).  In the PHP section, go to the Symfony tab.  In the Symfony script field, find or enter the path for the symfony script in your local framework installation; don&#8217;t refrence the batch file, but rather the one without an extension.  Mine is installed at: /usr/share/php/symfony/symfony12/data/bin/symfony</p>
<p>Since we&#8217;re likely to be in the middle of a project we&#8217;ll set up NetBeans to use this project.  In the future, you can set up a symfony project from NetBeans (which will run commands such as &#8220;symfony generate:project&#8221; and &#8220;symfony generate:app&#8221; for you).</p>
<p>Start a new project (File &gt; New Project).  Choose to create a &#8220;PHP Application with Existing Sources&#8221;.  Click &#8220;Next&#8221;.  Set the source folder to the project&#8217;s root folder.  It&#8217;s best to place the NetBeans metadata in a seperate folder outside of the project.  The default for this is within your home directory and will work fine.  Click &#8220;Next&#8221;.  If you wish you can set up the accesible URL for your project here (or you can do so as part of the full project configuration later).</p>
<p>NetBeans will, upon analyzing the project, determine that it is a symfony project.  However, to have full symfony help, you&#8217;ll need to add the framework to the Project Include Path for the project and the project cache.  (Yes, this is kinda stupid at first, but it will be a lifesaver!)  To add to the Include Path, right-click on the Include Path in the Project Display Pane (should be, by default, the pane in the upper-left; the Include Path should be at the bottom of the list.)  I add the cache directory of the project and the lib directory of the framework (for me, this is: /usr/share/php/symfony/symfony12/lib).  Once these are added and scanned, their functions should be available in the on-screen tooltips as you type.  The reason to add these directories (especially the framework) are because it is expected that we might be editing non-Symfony files with the editor and we don&#8217;t want functions and classes that are not accessible to the script to be displayed.</p>
<p>Once you have the project up, to finish your configuration, right click on the project name in the Project Display Pane and select &#8220;Properties&#8221;.  On &#8220;Sources&#8221; make sure that the Source Folder is the root of the symfony project.  You can change the &#8220;Test Folder&#8221; to the test folder within the project.  Set the web root to the web folder within the project.  Go to the &#8220;Run Configuration&#8221; bullet point.  Ensure that the Project URL is correct for accessing the application.  Once the URL path is set, choose one of the application_dev.php files within the web directory of the project for the &#8220;Index File&#8221;.</p></blockquote>
<p>Some of the fun aspects of the new IDE:  besides having accurate tooltips about variables and functions, you have the ability to jump (via a right-click) between actions and views.  This can be very useful at times when you are trying to track down a particular bug.  Another fun trick is to Ctrl-click on a function or a class name: you will jump to that item&#8217;s declaration.</p>
<p>That should do it for you!  If you have xdebug installed, you should also be able to use the build-in debugger (I haven&#8217;t really used it yet, but can already tell just how useful it will be).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2010/01/how-i-use-netbeans-6-8-and-symfony-1-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Slowly Slowly Dying</title>
		<link>http://blog.doggetto.com/2009/07/slowly-slowly-dying/</link>
		<comments>http://blog.doggetto.com/2009/07/slowly-slowly-dying/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 20:55:53 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/2009/07/slowly-slowly-dying/</guid>
		<description><![CDATA[
The lack of updates is a combination between laziness last week and complete and utter exhaustion this week.  I have a HUGE project due at work that needs to be finished before August 1st.  And, right now, even pulling long days I&#8217;m not entirely optimistic about reaching that.  I&#8217;m working hard, so [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/billward/"><img src="/wp-content/uploads/soccer_dying.jpg" alt="To an Athlete Dying Young" title="To an Athlete Dying Young" width="232" height="250" class="content-img" /></a>
<p class="intro">The lack of updates is a combination between laziness last week and complete and utter exhaustion this week.  I have a HUGE project due at work that needs to be finished before August 1st.  And, right now, even pulling long days I&#8217;m not entirely optimistic about reaching that.  I&#8217;m working <em>hard</em>, so we&#8217;ll see.</p>
<p>In the other, slightly related, news I&#8217;m attending the Sunstone Symposium this year (gasp!).  We&#8217;ll see if it&#8217;s as crazy/apostate/awesome/spiritual as I&#8217;ve heard it described as.  I&#8217;m sure I&#8217;ll have things to say on my blog about it.  I say it&#8217;s related as if we don&#8217;t make this deadline I&#8217;m not really certain about my ability to attend.</p>
<p>And that&#8217;s about it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2009/07/slowly-slowly-dying/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All Finished&#8230;</title>
		<link>http://blog.doggetto.com/2009/07/all-finished/</link>
		<comments>http://blog.doggetto.com/2009/07/all-finished/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 23:00:43 +0000</pubDate>
		<dc:creator>NoCoolName_Tom</dc:creator>
				<category><![CDATA[History]]></category>
		<category><![CDATA[Mormon]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[politics]]></category>
		<category><![CDATA[mormon history]]></category>

		<guid isPermaLink="false">http://blog.doggetto.com/?p=423</guid>
		<description><![CDATA[
Whew, that was a LOT of writing.  I wasn&#8217;t really expecting that when I decided to do this short series.  Still, I think I got into the hang of keeping a regular blog.  I doubt I&#8217;ll be able to keep it up daily like I have been, but we&#8217;ll see.  I [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="Done!" title="done!" class="content-img-right" src="/wp-content/uploads/finished.jpg" height="190" width="287">
<p class="intro">Whew, that was a LOT of writing.  I wasn&#8217;t really expecting that when I decided to do this short series.  Still, I think I got into the hang of keeping a regular blog.  I doubt I&#8217;ll be able to keep it up daily like I have been, but we&#8217;ll see.  I have a few idea for other interesting posts but for the next while things will get a lot more mundane around here.</p>
<p>I hope everyone enjoyed this series.  Perhaps later I&#8217;ll go back and source material and such, but until then I&#8217;ll leave the comments open on all of them so that people can continue to add (or fix) material.<span id="more-423"></span></p>
<p class="intro">My hope in regards to Mormon history is that the publishing of <em>Rough Stone Rolling</em> and <em>Massacre at Mountain Meadows</em> heralds a new era of Mormon history: one where the average member of the Church is more exposed to better history than ever before.  It&#8217;s time to stamp out the myths and legends: the real way that things happened is much cooler!  I won&#8217;t deny that occasionally it is messier, but, to me, it is far more <em>real</em> that way.  I find that, while I can&#8217;t possibly begin to feel what the mythic Joseph Smith is like, the human Joseph Smith is someone that I can relate to, kinda understand, and ultimately respect far more.  I hope that any of the possibly troubling aspects of anything that I&#8217;ve written will not be troubling to future Latter-day Saints!  I also hope they weren&#8217;t troubling to anyone here reading them.</p>
<p>Thanks again.  I&#8217;ll get off my soapbox now. <img src='http://blog.doggetto.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.doggetto.com/2009/07/all-finished/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
