<?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>4's symfony blog &#187; 插件</title>
	<atom:link href="http://www.foolbirds.com/t/%e6%8f%92%e4%bb%b6/feed" rel="self" type="application/rss+xml" />
	<link>http://www.foolbirds.com</link>
	<description>all about symfony</description>
	<lastBuildDate>Tue, 17 Aug 2010 01:22:43 +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>symfony1.2使用1.0插件sfFeedPlugin一例</title>
		<link>http://www.foolbirds.com/install-uncompatible-symfony-plugin-and-use-sffeedplugin.html</link>
		<comments>http://www.foolbirds.com/install-uncompatible-symfony-plugin-and-use-sffeedplugin.html#comments</comments>
		<pubDate>Tue, 20 Jan 2009 07:43:39 +0000</pubDate>
		<dc:creator>maker</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.foolbirds.com/?p=406</guid>
		<description><![CDATA[最近经常和symfony插件打交道, 发现插件真是提高开发效率和重用性的一个非常棒的解决方案, 真是居家旅行之必备良药.
废话到此为止, 今天研究了一下fabien potencier写的sfFeedPlugin, 官方出的插件品质没的说, 只是有一个问题比较头痛, 就是插件很久没有更新了在symfony1.2下无法使用命令进行安装. 这个问题比较普遍, 因为symfony1.0, 1.1, 1.2的差异还是比较大的,&#160; 插件package的结构也稍有不同, 但由于symfony基本结构和方法并没有发生太多变化, 所以很多插件其实都可以在其他版本上正常运行,&#160; 插件作者都没有精力也没有兴趣对这些问题进行修改, 这都在情理之中.&#160; 这样本文第一个要解决的问题就出现了,&#160; 如何安装不同版本的插件.
在1.2上安装sfFeedPlugin
其实我们要作的很简单, 只需要在旧版本上进行安装然后将插件目录copy到1.2的项目下就可以了.
首先检出或者安装旧版本的symfony源代码
$ svn co http://svn.symfony-project.com/branches/1.0 symfony1.0然后创建一个旧版本的项目
$ mkdir test$ cd test$ ../symfony1.0/data/bin/symfony init-proj test下一步,安装插件
$ ./symfony plugin-install http://plugins.symfony-project.org/sfFeedPlugin最后一步, 将插件目录复制到1.2项目中的plugins目录下.
$ cp -rf plugins/sfFeedPlugin pathto1.2project/plugins有些插件下还有web目录, 这样你还需要将web下以该插件名命名的文件夹复制到1.2项目的web目录下以确保插件完整.
这样其实就已经安装好了, 查看sfFeedPlugin的源代码会发现其实是一个类库, 参考网上其他的文章简单写了一个例子.
使用过程中发现了一个可能是兼容性问题, sfFeed.class.php中的context对象不正确, 将所有使用context的地方换成sfContext::getInstance()就可以了.
apps/frontend/modules/feed/actions/actions.class.php
public function executeIndex(sfWebRequest $request)
{
// get shops
$c = new Criteria();
$shops = ShopPeer::doSelect($c);
$feed = [...]]]></description>
			<content:encoded><![CDATA[<p>最近经常和symfony插件打交道, 发现插件真是提高开发效率和重用性的一个非常棒的解决方案, 真是居家旅行之必备良药.</p>
<p>废话到此为止, 今天研究了一下fabien potencier写的<a href="http://www.symfony-project.org/plugins/sfFeedPlugin">sfFeedPlugin</a>, 官方出的插件品质没的说, 只是有一个问题比较头痛, 就是插件很久没有更新了在symfony1.2下无法使用命令进行安装. 这个问题比较普遍, 因为symfony1.0, 1.1, 1.2的差异还是比较大的,&nbsp; 插件package的结构也稍有不同, 但由于symfony基本结构和方法并没有发生太多变化, 所以很多插件其实都可以在其他版本上正常运行,&nbsp; 插件作者都没有精力也没有兴趣对这些问题进行修改, 这都在情理之中.&nbsp; 这样本文第一个要解决的问题就出现了,&nbsp; 如何安装不同版本的插件.</p>
<p><strong>在1.2上安装sfFeedPlugin</strong></p>
<p>其实我们要作的很简单, 只需要在旧版本上进行安装然后将插件目录copy到1.2的项目下就可以了.</p>
<p>首先检出或者安装旧版本的symfony源代码<br />
<code>$ svn co http://svn.symfony-project.com/branches/1.0 symfony1.0</code>然后创建一个旧版本的项目<br />
<code>$ mkdir test</code><code>$ cd test</code><code>$ ../symfony1.0/data/bin/symfony init-proj test</code>下一步,安装插件<br />
<code>$ ./symfony plugin-install http://plugins.symfony-project.org/sfFeedPlugin</code>最后一步, 将插件目录复制到1.2项目中的plugins目录下.<br />
<code>$ cp -rf plugins/sfFeedPlugin pathto1.2project/plugins</code>有些插件下还有web目录, 这样你还需要将web下以该插件名命名的文件夹复制到1.2项目的web目录下以确保插件完整.</p>
<p>这样其实就已经安装好了, 查看sfFeedPlugin的源代码会发现其实是一个类库, 参考网上其他的文章简单写了一个例子.</p>
<p>使用过程中发现了一个可能是兼容性问题, sfFeed.class.php中的context对象不正确, 将所有使用context的地方换成sfContext::getInstance()就可以了.</p>
<p>apps/frontend/modules/feed/actions/actions.class.php<br />
<code>public function executeIndex(sfWebRequest $request)<br />
{<br />
// get shops<br />
$c = new Criteria();<br />
$shops = ShopPeer::doSelect($c);<br />
$feed = new sfRss201rev2Feed();<br />
// channel<br />
$feed-&gt;setTitle('New Shops');<br />
$feed-&gt;setLink('@homepage');<br />
$feed-&gt;setFeedUrl('feed/index');<br />
$feed-&gt;setDescription('All the new shops.');<br />
$feed-&gt;setAuthorEmail('***@gmail.com');<br />
$feed-&gt;setAuthorName('maker');<br />
// items<br />
foreach($shops as $shop)<br />
{<br />
$item = new sfFeedItem();<br />
$item-&gt;setTitle($shop-&gt;getName());<br />
$item-&gt;setLink('shop/index');<br />
$item-&gt;setAuthorName('maker');<br />
$item-&gt;setAuthorEmail('***@gmail.com');<br />
$item-&gt;setPubdate($shop-&gt;getCreatedAt('U'));<br />
$item-&gt;setUniqueId($shop-&gt;getName());<br />
$item-&gt;setDescription($shop-&gt;getDescription());<br />
$feed-&gt;addItem($item);<br />
}<br />
$this-&gt;feed = $feed;<br />
}</code>apps/frontend/modules/feed/config/view.yml<br />
<code>all:<br />
has_layout: off<br />
template:&nbsp;&nbsp; feed<br />
http_metas:<br />
content-type: text/xml </code></p>
<p>apps/frontend/modules/feed/templates/indexSuccess.php<br />
<code>&lt;?php decorate_with(false); ?&gt;<br />
&lt;?php echo $feed-&gt;getFeed(); ?&gt;</code>访问http://project/feed/index, 源代码如下<br />
<code>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;rss version="2.0"&gt;<br />
&lt;channel&gt;<br />
&lt;title&gt;New Shops&lt;/title&gt;<br />
&lt;link&gt;http://project/feed/index&lt;/link&gt;<br />
&lt;description&gt;All the new shops.&lt;/description&gt;<br />
&lt;language&gt;en&lt;/language&gt;<br />
&lt;item&gt;<br />
&lt;title&gt;shop name&lt;/title&gt;<br />
&lt;description&gt;shop description&lt;/description&gt;<br />
&lt;link&gt;http://first-symfony-project/pc_dev.php/&lt;/link&gt;<br />
&lt;guid isPermalink="false"&gt;shop name&lt;/guid&gt;<br />
&lt;author&gt;***@gmail.com (maker)&lt;/author&gt;<br />
&lt;pubDate&gt;Thu, 15 Jan 2009 16:12:11 +0800&lt;/pubDate&gt;<br />
&lt;/item&gt;<br />
&lt;item&gt;<br />
&lt;title&gt;shop name&lt;/title&gt;<br />
&lt;description&gt;shop description&lt;/description&gt;<br />
&lt;link&gt;http://first-symfony-project/pc_dev.php/&lt;/link&gt;<br />
&lt;guid isPermalink="false"&gt;shop name&lt;/guid&gt;<br />
&lt;author&gt;***@gmail.com (maker)&lt;/author&gt;<br />
&lt;pubDate&gt;Thu, 15 Jan 2009 16:12:11 +0800&lt;/pubDate&gt;<br />
&lt;/item&gt;<br />
&lt;/channel&gt;<br />
&lt;/rss&gt;</code></p>
<ul class="related_post"><li><a href="http://www.foolbirds.com/publish-a-symfony-plugin.html" title="发布你的symfony插件">发布你的symfony插件</a></li><li><a href="http://www.foolbirds.com/write-symfony-qrcode-plugin.html" title="symfony插件编写一例:QRcodePlugin">symfony插件编写一例:QRcodePlugin</a></li><li><a href="http://www.foolbirds.com/create-symfony-plugin.html" title="创建symfony插件">创建symfony插件</a></li><li><a href="http://www.foolbirds.com/use-colorpicke.html" title="插件使用一例:在form中加入拾色器">插件使用一例:在form中加入拾色器</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.foolbirds.com/install-uncompatible-symfony-plugin-and-use-sffeedplugin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>发布你的symfony插件</title>
		<link>http://www.foolbirds.com/publish-a-symfony-plugin.html</link>
		<comments>http://www.foolbirds.com/publish-a-symfony-plugin.html#comments</comments>
		<pubDate>Fri, 16 Jan 2009 10:08:18 +0000</pubDate>
		<dc:creator>maker</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[QRcodePlugin]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.foolbirds.com/?p=370</guid>
		<description><![CDATA[《symfony插件编写一例:QRcodePlugin》一文中我们编写了一个用来生成QRcode 的symfony插件, 本文我们将会将QRcodePlugin发布到symfony官方的插件库(http://www.symfony-project.org/plugins/).
发布插件的程序比较繁琐, 方便起见我们使用一款插件来辅助我们发布插件 sfTaskExtraPlugin, 该插件扩展了symfony命令, 使用generate:plugin可以生成插件的基本目录结构, plugin:package命令来帮助我们将插件打包.
接下来是最复杂的地方, symfony是通过PEAR来进行packages管理的, 所以我们要将插件打成一个PEAR package. 一个发布到官方插件库的插件需要有一个LICENSE和一个README, 这两个文件要放在插件根目录下. README里需要写插件的说明和使用方法, README 使用 Markdown format, LICENSE文件是许可协议, symfony支持MIT, BSD, LGPL, 和PHP协议.
一个package包括package.xml和源代码, package.xml里对插件进行了详细的描述, 包括目录结构, 插件版本, 更新记录等等. 关于该文件的详细说明请参考PEAR package syntax(http://pear.php.net/manual/en/guide-developers.php)
由于package.xml结构复杂, 所以不做过多的讲解, 我们使用前面介绍过的plugin:package命令来生成package.xml.
$./symfony plugin:package QRcodePlugin&#62; Summarize your plugin in one line:用一行文字对插件进行简单的描述
$create QR code image&#62; Lead developer name:主要开发者的名字
$maker&#62; Lead developer email主要开发者的邮箱
$****@gmail.com&#62; Lead developer username:主要开发者的symfony帐号, 没有去这里注册 http://www.symfony-project.org/user/new
$m4ker&#62; Plugin [...]]]></description>
			<content:encoded><![CDATA[<p>《<a href="http://www.foolbirds.com/write-symfony-qrcode-plugin.html">symfony插件编写一例:QRcodePlugin</a>》一文中我们编写了一个用来生成<a href="http://www.symfony-project.org/plugins/QRcodePlugin">QRcode</a> 的symfony插件, 本文我们将会将QRcodePlugin发布到<a href="http://www.symfony-project.org/">symfony</a>官方的插件库(<a href="http://www.symfony-project.org/plugins/">http://www.symfony-project.org/plugins/</a>).</p>
<p>发布插件的程序比较繁琐, 方便起见我们使用一款插件来辅助我们发布插件 <a href="http://www.symfony-project.org/plugins/sfTaskExtraPlugin">sfTaskExtraPlugin</a>, 该插件扩展了symfony命令, 使用generate:plugin可以生成插件的基本目录结构, plugin:package命令来帮助我们将插件打包.</p>
<p>接下来是最复杂的地方, symfony是通过<a href="http://pear.php.net">PEAR</a>来进行packages管理的, 所以我们要将插件打成一个PEAR package. 一个发布到官方插件库的插件需要有一个LICENSE和一个README, 这两个文件要放在插件根目录下. README里需要写插件的说明和使用方法, README 使用 <a href="http://daringfireball.net/projects/markdown/syntax">Markdown format</a>, LICENSE文件是许可协议, symfony支持MIT, BSD, LGPL, 和PHP协议.</p>
<p>一个package包括package.xml和源代码, package.xml里对插件进行了详细的描述, 包括目录结构, 插件版本, 更新记录等等. 关于该文件的详细说明请参考<a href="http://pear.php.net/manual/en/guide-developers.php">PEAR package syntax</a>(<a href="http://pear.php.net/manual/en/guide-developers.php">http://pear.php.net/manual/en/guide-developers.php</a>)</p>
<p>由于package.xml结构复杂, 所以不做过多的讲解, 我们使用前面介绍过的plugin:package命令来生成package.xml.<br />
<code>$./symfony plugin:package QRcodePlugin</code><code>&gt; Summarize your plugin in one line:</code>用一行文字对插件进行简单的描述<br />
<code>$create QR code image</code><code>&gt; Lead developer name:</code>主要开发者的名字<br />
<code>$maker</code><code>&gt; Lead developer email</code>主要开发者的邮箱<br />
<code>$****@gmail.com</code><code>&gt; Lead developer username:</code>主要开发者的symfony帐号, 没有去这里注册 http://www.symfony-project.org/user/new<br />
<code>$m4ker</code><code>&gt; Plugin version number (i.e. "1.0.5"):</code>package版本号<br />
<code>$0.0.1</code><code>&gt; Plugin stability:</code>发布状态, 这里注意1.0.0一下能使用alpha和beta, 1.0.0以上可以使用stable, 再具体就没有研究了.<br />
<code>$beta</code>运行完毕会生成一个QRcodePlugin-0.0.1.tgz, 但是这个文件是不能直接上传到插件库中的, 因为package.xml中没有changelog.我们把包打开, 编辑package.xml<br />
<code>$tar zxf QRcodePlugin-0.0.1.tgz</code><code>$vi package.xml</code>找到</p>
<p><code>&lt;changelog /&gt;</code></p>
<p>替换成</p>
<p><code>&lt;changelog&gt;<br />
&lt;release&gt;<br />
&lt;version&gt;<br />
&lt;release&gt;0.0.1&lt;/release&gt;<br />
&lt;api&gt;0.0.1&lt;/api&gt;<br />
&lt;/version&gt;<br />
&lt;stability&gt;<br />
&lt;release&gt;beta&lt;/release&gt;<br />
&lt;api&gt;beta&lt;/api&gt;<br />
&lt;/stability&gt;<br />
&lt;license uri="http://www.symfony-project.com/license"&gt;<br />
MIT license<br />
&lt;/license&gt;<br />
&lt;date&gt;2009-1-16&lt;/date&gt;<br />
&lt;license&gt;MIT&lt;/license&gt;<br />
&lt;notes&gt;<br />
* maker: First release of the plugin<br />
&lt;/notes&gt;<br />
&lt;/release&gt;<br />
&lt;/changelog&gt;</code></p>
<p>然后再原样打包<br />
<code>$tar zcf QRcodePlugin-0.0.1.tgz QRcodePlugin-0.0.1/ package.xml</code>这样我们就生成了一个可以上传到官方插件库的package了, 接下来呢, 我们要去symfony 官方网站创建一个Plugin, 如果你没有帐号, 要先创建一个帐号.</p>
<p><a href="http://www.symfony-project.org/user/new">http://www.symfony-project.org/user/new</a></p>
<p><img class="aligncenter size-full wp-image-387" title="screenshot-11" src="http://www.foolbirds.com/wp-content/uploads/2009/01/screenshot-11.png" alt="screenshot-11" width="463" height="717" /></p>
<p>然后登录到 plugin system(<a href="http://www.symfony-project.org/plugins/">http://www.symfony-project.org/plugins/</a>)中.</p>
<p><img class="aligncenter size-full wp-image-388" title="screenshot-2" src="http://www.foolbirds.com/wp-content/uploads/2009/01/screenshot-2.png" alt="screenshot-2" width="315" height="501" />Create a new plugin 进入插件创建页面(<a href="http://www.symfony-project.org/plugins/new">http://www.symfony-project.org/plugins/new</a>)</p>
<p><img class="aligncenter size-medium wp-image-389" title="screenshot-5" src="http://www.foolbirds.com/wp-content/uploads/2009/01/screenshot-5-300x219.png" alt="screenshot-5" width="300" height="219" />在创建页面我们需要填写</p>
<p style="padding-left: 30px;">插件名: QRcodePlugin</p>
<p style="padding-left: 30px;">是否加入插件库: 选中</p>
<p style="padding-left: 30px;">插件源地址: <a href="http://svn.symfony-project.com/plugins/QRcodePlugin">http://svn.symfony-project.com/plugins/QRcodePlugin</a></p>
<p style="padding-left: 30px;">插件主页: <a href="http://www.foolbirds.com">http://www.foolbirds.com</a></p>
<p style="padding-left: 30px;">Ticketing URL:</p>
<p style="padding-left: 30px;">选择支持哪种ORM?</p>
<p style="padding-left: 30px;">描述: &#8230;</p>
<p style="padding-left: 30px;">图片:</p>
<p style="padding-left: 30px;">分类:</p>
<p>填写完毕之后提交, 我们就创建了一个Plugin.然后我们来上传QRcodePlugin的第一个版本, 进入插件首页(<a href="http://www.symfony-project.org/plugins/QRcodePlugin">http://www.symfony-project.org/plugins/QRcodePlugin</a>)中的Admin页面.</p>
<p><img class="aligncenter size-full wp-image-390" title="screenshot-6" src="http://www.foolbirds.com/wp-content/uploads/2009/01/screenshot-6.png" alt="screenshot-6" width="699" height="414" /></p>
<p>在New Release表单中上传我们的QRcodePlugin-0.0.1.tgz</p>
<p><img class="aligncenter size-full wp-image-391" title="screenshot-7" src="http://www.foolbirds.com/wp-content/uploads/2009/01/screenshot-7.png" alt="screenshot-7" width="603" height="301" /></p>
<p>上传成功后我们会看到Releases中多了一项类似下面这样:</p>
<p><img class="aligncenter size-full wp-image-392" title="screenshot-8" src="http://www.foolbirds.com/wp-content/uploads/2009/01/screenshot-8.png" alt="screenshot-8" width="552" height="80" /></p>
<p>这样我们的插件就成功的加入到了官方插件库, 接下来我们使用官方方法测试一下是否可以安装.<br />
<code>$./symfony plugin:install QRcodePlugin --release=0.0.1</code><code>&gt;&gt; plugin&nbsp;&nbsp;&nbsp; installing plugin "QRcodePlugin"<br />
&gt;&gt; sfPearFrontendPlugin Attempting to discover channel "pear.symfony-project.com"...<br />
&gt;&gt; sfPearFrontendPlugin downloading channel.xml ...<br />
&gt;&gt; sfPearFrontendPlugin Starting to download channel.xml (663 bytes)<br />
&gt;&gt; sfPearFrontendPlugin .<br />
&gt;&gt; sfPearFrontendPlugin ...done: 663 bytes<br />
&gt;&gt; sfPearFrontendPlugin Auto-discovered channel "pear.symfony-project.com", alias<br />
&gt;&gt; sfPearFrontendPlugin "symfony", adding to registry<br />
&gt;&gt; sfPearFrontendPlugin Attempting to discover channel<br />
&gt;&gt; sfPearFrontendPlugin "plugins.symfony-project.org"...<br />
&gt;&gt; sfPearFrontendPlugin downloading channel.xml ...<br />
&gt;&gt; sfPearFrontendPlugin Starting to download channel.xml (639 bytes)<br />
&gt;&gt; sfPearFrontendPlugin ...done: 639 bytes<br />
&gt;&gt; sfPearFrontendPlugin Auto-discovered channel "plugins.symfony-project.org", alias<br />
&gt;&gt; sfPearFrontendPlugin "symfony-plugins", adding to registry<br />
&gt;&gt; sfPearFrontendPlugin downloading QRcodePlugin-0.0.3.tgz ...<br />
&gt;&gt; sfPearFrontendPlugin Starting to download QRcodePlugin-0.0.3.tgz (1,035,616 bytes)<br />
&gt;&gt; sfPearFrontendPlugin ...done: 1,035,616 bytes<br />
&gt;&gt; sfSymfonyPluginManager Installation successful for plugin "QRcodePlugin"<br />
&gt;&gt; sfSymfonyPluginManager Installing web data for plugin</code><code>$ls plugins</code><code>&gt;&gt;QRcodePlugin</code><br />
安装成功, 本文完.</p>
<ul class="related_post"><li><a href="http://www.foolbirds.com/install-uncompatible-symfony-plugin-and-use-sffeedplugin.html" title="symfony1.2使用1.0插件sfFeedPlugin一例">symfony1.2使用1.0插件sfFeedPlugin一例</a></li><li><a href="http://www.foolbirds.com/write-symfony-qrcode-plugin.html" title="symfony插件编写一例:QRcodePlugin">symfony插件编写一例:QRcodePlugin</a></li><li><a href="http://www.foolbirds.com/create-symfony-plugin.html" title="创建symfony插件">创建symfony插件</a></li><li><a href="http://www.foolbirds.com/use_symfony_filter_to_filteredurl.html" title="使用SYMFONY Filter 过滤URL">使用SYMFONY Filter 过滤URL</a></li><li><a href="http://www.foolbirds.com/%e4%bb%bfsymfony%e6%9c%ba%e5%88%b6%e5%ae%9e%e7%8e%b0%e4%b8%8d%e7%94%a8require%e6%88%96%e8%80%85include%e6%9d%a5%e5%ae%9e%e4%be%8b%e5%8c%96%e7%b1%bb.html" title="仿symfony机制实现不用require或者include来实例化类">仿symfony机制实现不用require或者include来实例化类</a></li><li><a href="http://www.foolbirds.com/use-datetime-in-php5-1-x-with-symfony.html" title="symfony1.4 DateTime对于PHP低版本的兼容问题">symfony1.4 DateTime对于PHP低版本的兼容问题</a></li><li><a href="http://www.foolbirds.com/%e5%a6%82%e4%bd%95%e5%9c%a8fixtures-yml%e5%86%99%e5%be%aa%e7%8e%af%e6%b7%bb%e5%8a%a0%e6%95%b0%e6%8d%ae.html" title="如何在fixtures.yml写循环添加数据">如何在fixtures.yml写循环添加数据</a></li><li><a href="http://www.foolbirds.com/symfony-1-4-database-utf8.html" title="symfony 1.4 数据库 utf8设置">symfony 1.4 数据库 utf8设置</a></li><li><a href="http://www.foolbirds.com/symfony-cheat-sheet.html" title="symfony cheat sheet">symfony cheat sheet</a></li><li><a href="http://www.foolbirds.com/cheat-sheets.html" title="Cheat Sheets!">Cheat Sheets!</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.foolbirds.com/publish-a-symfony-plugin.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>symfony插件编写一例:QRcodePlugin</title>
		<link>http://www.foolbirds.com/write-symfony-qrcode-plugin.html</link>
		<comments>http://www.foolbirds.com/write-symfony-qrcode-plugin.html#comments</comments>
		<pubDate>Fri, 16 Jan 2009 08:41:10 +0000</pubDate>
		<dc:creator>maker</dc:creator>
				<category><![CDATA[CentOS/Redhat]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.foolbirds.com/?p=373</guid>
		<description><![CDATA[《创建symfony插件》一文中对如何编写插件进行了简单的介绍, 下面用一个例子来详细讲解一些如何创建一个生成QRcode的插件.
什么是QR code(QR码)?
简单来说, QR code是用来存储数据的矩形黑白点阵, 可以在很小的图片中存储大量的数据, 在移动领域应用广泛. 详细的说明请参考维基百科(http://zh.wikipedia.org/wiki/QR%E7%A2%BC)
应项目需求, 我们要编写一个用来生成QR code的Helper, 为了更好的重用性, 我们要将这个Helper写成一个插件.
首先, 创建目录结构
$cd plugins$mkdir QRcodePlugin$cd QRcodePlugin$mkdir lib web$mkdir lib/helper
生成QR code的过程中我们使用到了一个第三方类库 qr_img0.50g, 在readme中我们找到了使用方法如下:
php/qr_img.php?d=data[&#38;e=(L,M,Q,H)][&#38;s=int size][&#38;v=(1-40)][&#38;t=J]
[&#38;m=(1-16)&#38;n=(2-16)[&#38;o=original data][&#38;p=(0-255)]]
访问该文件会根据url中的参数生成一个QR code 图片, 我们只要将这个库放到web目录下就可以了.
$mv qr_img0.50g pathtoproject/plugins/QRcodePlugin/web/qr_img
然后我们来编写Helper, 根据symfony中helper的命名规则创建文件如下
$cd pathtoproject/plugins/QRcodePlugin/lib/helper
$vi QRcodeHelper.php
&#60;?php
# [useage]
#   qr_img.php?d=[data]&#38;e=[(L,M,Q,H)]&#38;s=[int]&#38;v=[(1-40)]
#             (&#38;m=[(1-16)]&#38;n=[(2-16)](&#38;p=[(0-255)],&#38;o=[data]))
#
#   d= data   [...]]]></description>
			<content:encoded><![CDATA[<p>《<a href="http://www.foolbirds.com/create-symfony-plugin.html">创建symfony插件</a>》一文中对如何编写插件进行了简单的介绍, 下面用一个例子来详细讲解一些如何创建一个生成<a href="http://zh.wikipedia.org/wiki/QR%E7%A2%BC">QRcode</a>的插件.</p>
<blockquote><p>什么是QR code(QR码)?</p>
<p>简单来说, QR code是用来存储数据的矩形黑白点阵, 可以在很小的图片中存储大量的数据, 在移动领域应用广泛. 详细的说明请参考<a href="http://zh.wikipedia.org/">维基百科</a>(<a href="http://zh.wikipedia.org/wiki/QR%E7%A2%BC">http://zh.wikipedia.org/wiki/QR%E7%A2%BC</a>)</p></blockquote>
<p>应项目需求, 我们要编写一个用来生成QR code的Helper, 为了更好的重用性, 我们要将这个Helper写成一个插件.</p>
<p>首先, 创建目录结构<br />
<code>$cd plugins</code><code>$mkdir QRcodePlugin</code><code>$cd QRcodePlugin</code><code>$mkdir lib web</code><code>$mkdir lib/helper</code></p>
<p>生成QR code的过程中我们使用到了一个第三方类库 <a href="http://www.swetake.com/qr/qr_cgi_e.html">qr_img0.50g</a>, 在readme中我们找到了使用方法如下:</p>
<blockquote><p>php/qr_img.php?d=data[&amp;e=(L,M,Q,H)][&amp;s=int size][&amp;v=(1-40)][&amp;t=J]<br />
[&amp;m=(1-16)&amp;n=(2-16)[&amp;o=original data][&amp;p=(0-255)]]</p></blockquote>
<p>访问该文件会根据url中的参数生成一个QR code 图片, 我们只要将这个库放到web目录下就可以了.</p>
<p><code>$mv qr_img0.50g pathtoproject/plugins/QRcodePlugin/web/qr_img</code></p>
<p>然后我们来编写Helper, 根据symfony中helper的命名规则创建文件如下</p>
<p><code>$cd pathtoproject/plugins/QRcodePlugin/lib/helper</code></p>
<p><code>$vi QRcodeHelper.php</code></p>
<p><code>&lt;?php<br />
# [useage]<br />
#   qr_img.php?d=[data]&amp;e=[(L,M,Q,H)]&amp;s=[int]&amp;v=[(1-40)]<br />
#             (&amp;m=[(1-16)]&amp;n=[(2-16)](&amp;p=[(0-255)],&amp;o=[data]))<br />
#<br />
#   d= data         URL encoded data.<br />
#   e= ECC level    L or M or Q or H   (default M)<br />
#   s= module size  (dafault PNG:4 JPEG:8)<br />
#   v= version      1-40 or Auto select if you do not set.<br />
#   t= image type   J:jpeg image , other: PNG image<br />
#<br />
#  structured append  m of n (experimental)<br />
#   n= structure append n (2-16)<br />
#   m= structure append m (1-16)<br />
#   p= parity<br />
#   o= original data (URL encoded data)  for calculating parity<br />
#<br />
function QRcode($d, $e = 'M', $s = null, $v = null, $t = 'P', $m = null, $n = null, $o = null, $p = null)<br />
{<br />
$path  = '/QRcodePlugin/qr_img/php/qr_img.php';<br />
$url   = $path . '?d=' . $d;<br />
if ($e &amp;&amp; in_array(strtoupper($e), array('L', 'M', 'Q', 'H'))) {<br />
$url .= '&amp;e=' . strtoupper($e);<br />
} else {<br />
$url .= '&amp;e=M';<br />
}<br />
if ($s) {<br />
$url .= '&amp;s=' . $s;<br />
}<br />
if ($v) {<br />
$url .= '&amp;v=' . $v;<br />
}<br />
if ($t) {<br />
$url .= '&amp;t=' . $t;<br />
}<br />
if ($m) {<br />
$url .= '&amp;m=' . $m;<br />
}<br />
if ($n) {<br />
$url .= '&amp;n=' . $n;<br />
}<br />
if ($o) {<br />
$url .= '&amp;o=' . $o;<br />
}<br />
if ($p) {<br />
$url .= '&amp;p=' . $p;<br />
}<br />
$output = image_tag($url, array('alt' =&gt; $d));<br />
return $output;<br />
}<br />
</code><br />
这样, 我们就写好了一个只有一个Helper的Plugin, 我们来看一下插件结构如下.<br />
<code>|--.lib<br />
|...`--.helper<br />
|.......`--.QRcodeHelper.php<br />
`--.web<br />
....`--.qr_img<br />
........|--.data<br />
........|--.image<br />
........`--.php<br />
............`--.qr_img.php</code>《<a href="http://www.foolbirds.com/create-symfony-plugin.html">创建symfony插件</a>》一文中我们说过项目中是无法直接访问plugin中的web目录的, 所以我们还要copy一份web目录到项目的web目录下<br />
<code>$cp -rf pathtoproject/plugins/QRcodePlugin/web pathtoproject/web/QRcodePlugin</code>接下来我们来测试一下Plugin是否有效.<br />
<code>$cd pathtoproject/</code><code>$./symfony init-app test</code><code>$./symfony init-module test test</code><code>$vi apps/test/modules/test/actions/actions.class.php</code><code>&lt;?php<br />
class testActions extends sfActions<br />
{<br />
public function executeIndex(sfWebRequest $request) { }<br />
}</code></p>
<p><code>$vi apps/test/modules/test/templates/indexSuccess.php</code><code>&lt;?php use_helper('QRcode');?&gt;<br />
&lt;?php echo QRcode('fuck');?&gt;<br />
</code></p>
<p>访问http://project/test.php/test/index效果如下:</p>
<p><img class="aligncenter size-full wp-image-374" title="screenshot4" src="http://www.foolbirds.com/wp-content/uploads/2009/01/screenshot4.png" alt="screenshot4" width="435" height="323" /></p>
<p>源代码如下:</p>
<p><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;link rel="shortcut icon" href="/favicon.ico" /&gt;<br />
&lt;link rel="stylesheet" type="text/css" media="screen" href="/css/main.css" /&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;img alt="fuck" src="/QRcodePlugin/qr_img/php/qr_img.php?d=fuck&amp;t=P" /&gt;&nbsp;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code><br />
测试通过, 本文完.</p>
<ul class="related_post"><li><a href="http://www.foolbirds.com/install-uncompatible-symfony-plugin-and-use-sffeedplugin.html" title="symfony1.2使用1.0插件sfFeedPlugin一例">symfony1.2使用1.0插件sfFeedPlugin一例</a></li><li><a href="http://www.foolbirds.com/publish-a-symfony-plugin.html" title="发布你的symfony插件">发布你的symfony插件</a></li><li><a href="http://www.foolbirds.com/create-symfony-plugin.html" title="创建symfony插件">创建symfony插件</a></li><li><a href="http://www.foolbirds.com/use-colorpicke.html" title="插件使用一例:在form中加入拾色器">插件使用一例:在form中加入拾色器</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.foolbirds.com/write-symfony-qrcode-plugin.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>创建symfony插件</title>
		<link>http://www.foolbirds.com/create-symfony-plugin.html</link>
		<comments>http://www.foolbirds.com/create-symfony-plugin.html#comments</comments>
		<pubDate>Fri, 16 Jan 2009 07:50:17 +0000</pubDate>
		<dc:creator>maker</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.foolbirds.com/?p=367</guid>
		<description><![CDATA[symfony是一款支持插件机制的php框架, 在使用symfony开发项目的时候可以很方便的从官方(http://www.symfony-project.org/plugins)下载到由其他开发者贡献出来的插件.
关于插件的使用请参考 http://www.symfony-project.org/book/1_2/17-Extending-Symfony#Plug-Ins
当使用symfony一段时间后, 我们可能有很多可以重用的代码, 为了方便以后重用, 我们可以将这些代码创建成插件, 甚至可以发布到官方的插件库中提供他人下载使用.
symfony1.2中插件位于项目根目录的plugins目录下, symfony1.2的插件的目录结构如下:
&#124;--.LICENSE
&#124;--.README
&#124;--.config
&#124;...&#124;--.app.yml
&#124;...&#124;--.cache.yml
&#124;...&#124;--.routing.yml
&#124;...&#124;--.schema.yml
&#124;...&#124;--.security.yml
&#124;...&#124;--.settings.yml
&#124;...&#124;--.pluginNamePluginConfiguration.class.php
&#124;...`--.view.yml
&#124;--.doc
&#124;--.i18n
&#124;--.log
&#124;--.lib
&#124;...&#124;--.filter
&#124;...&#124;--.form
&#124;...&#124;--.helper
&#124;...&#124;--.model
&#124;...&#124;--.task
&#124;...&#124;--.validator
&#124;...`--.widget
&#124;--.modules
&#124;...`--.testPlugin
&#124;.......&#124;--.actions
&#124;.......&#124;...`--.actions.class.php
&#124;.......&#124;--.config
&#124;.......`--.templates
&#124;...........`--.indexSuccess.php
&#124;--.templates
&#124;...`--.layout.php
&#124;--.test
`--.web
....&#124;--.css
....&#124;...`--.main.css
....&#124;--.images
....&#124;--.js
....&#124;--.robots.txt
.....`--.uploads
........`--.assets
目录结构很清晰, 虽然目录很文件很多但都不是必须的, 你只需要编写你要扩展的那部分文件就可以了.在插件中我们可以象在项目中一样自动加载config, 编写action和template, 自动加载lib等等.
如果我们想写一个helper插件, 那么我们只要建立一个lib目录和一个/lib/helper目录, 并将helper放在helper目录下就可以使用了.
如果你要扩展一个动作, 那你只需要象平常一样修改mudules目录, 修改你要使用该动作的app的settings.yml如下:
/apps/frontend/config/settings.yml
enabled_modules: [default, pluginModuleName]
然后你就可以通过http://project/frontend_dev.php/pluginModuleName/index访问到插件中的动作了.
插件中的web目录是比较特殊的, 由于symfony独特的目录结构, 你并不可能直接访问到plugin的web目录, 在安装plugin的过程成, symfony会自动将插件中的web目录copy到项目的web目录下, 并以plugin命来重命名plugin的web目录, 所以如果你想你访问你自己编写的插件中的web目录也要将web目录copy到项目的web目录下并重新命名.
参考: http://www.symfony-project.org/jobeet/1_2/Propel/en/20
symfony1.2使用1.0插件sfFeedPlugin一例发布你的symfony插件symfony插件编写一例:QRcodePlugin插件使用一例:在form中加入拾色器]]></description>
			<content:encoded><![CDATA[<p>symfony是一款支持插件机制的php框架, 在使用symfony开发项目的时候可以很方便的从官方(<a href="http://www.symfony-project.org/plugins" target="_blank">http://www.symfony-project.org/plugins</a>)下载到由其他开发者贡献出来的插件.</p>
<p>关于插件的使用请参考 <a href="http://www.symfony-project.org/book/1_2/17-Extending-Symfony#Plug-Ins">http://www.symfony-project.org/book/1_2/17-Extending-Symfony#Plug-Ins</a></p>
<p>当使用symfony一段时间后, 我们可能有很多可以重用的代码, 为了方便以后重用, 我们可以将这些代码创建成插件, 甚至可以发布到官方的插件库中提供他人下载使用.</p>
<p>symfony1.2中插件位于项目根目录的plugins目录下, symfony1.2的插件的目录结构如下:</p>
<p><code>|--.LICENSE<br />
|--.README<br />
|--.config<br />
|...|--.app.yml<br />
|...|--.cache.yml<br />
|...|--.routing.yml<br />
|...|--.schema.yml<br />
|...|--.security.yml<br />
|...|--.settings.yml<br />
|...|--.pluginNamePluginConfiguration.class.php<br />
|...`--.view.yml<br />
|--.doc<br />
|--.i18n<br />
|--.log<br />
|--.lib<br />
|...|--.filter<br />
|...|--.form<br />
|...|--.helper<br />
|...|--.model<br />
|...|--.task<br />
|...|--.validator<br />
|...`--.widget<br />
|--.modules<br />
|...`--.testPlugin<br />
|.......|--.actions<br />
|.......|...`--.actions.class.php<br />
|.......|--.config<br />
|.......`--.templates<br />
|...........`--.indexSuccess.php<br />
|--.templates<br />
|...`--.layout.php<br />
|--.test<br />
`--.web<br />
....|--.css<br />
....|...`--.main.css<br />
....|--.images<br />
....|--.js<br />
....|--.robots.txt<br />
.....`--.uploads<br />
........`--.assets</code></p>
<p>目录结构很清晰, 虽然目录很文件很多但都不是必须的, 你只需要编写你要扩展的那部分文件就可以了.在插件中我们可以象在项目中一样自动加载config, 编写action和template, 自动加载lib等等.</p>
<p>如果我们想写一个helper插件, 那么我们只要建立一个lib目录和一个/lib/helper目录, 并将helper放在helper目录下就可以使用了.</p>
<p>如果你要扩展一个动作, 那你只需要象平常一样修改mudules目录, 修改你要使用该动作的app的settings.yml如下:</p>
<p>/apps/frontend/config/settings.yml<br />
<code>enabled_modules: [default, pluginModuleName]</code></p>
<p>然后你就可以通过http://project/frontend_dev.php/pluginModuleName/index访问到插件中的动作了.</p>
<p>插件中的web目录是比较特殊的, 由于symfony独特的目录结构, 你并不可能直接访问到plugin的web目录, 在安装plugin的过程成, symfony会自动将插件中的web目录copy到项目的web目录下, 并以plugin命来重命名plugin的web目录, 所以如果你想你访问你自己编写的插件中的web目录也要将web目录copy到项目的web目录下并重新命名.</p>
<p>参考: <a href="http://www.symfony-project.org/jobeet/1_2/Propel/en/20">http://www.symfony-project.org/jobeet/1_2/Propel/en/20</a></p>
<ul class="related_post"><li><a href="http://www.foolbirds.com/install-uncompatible-symfony-plugin-and-use-sffeedplugin.html" title="symfony1.2使用1.0插件sfFeedPlugin一例">symfony1.2使用1.0插件sfFeedPlugin一例</a></li><li><a href="http://www.foolbirds.com/publish-a-symfony-plugin.html" title="发布你的symfony插件">发布你的symfony插件</a></li><li><a href="http://www.foolbirds.com/write-symfony-qrcode-plugin.html" title="symfony插件编写一例:QRcodePlugin">symfony插件编写一例:QRcodePlugin</a></li><li><a href="http://www.foolbirds.com/use-colorpicke.html" title="插件使用一例:在form中加入拾色器">插件使用一例:在form中加入拾色器</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.foolbirds.com/create-symfony-plugin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
