<?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/%e7%bb%84%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>在admin generator中加入复杂的自定义列</title>
		<link>http://www.foolbirds.com/admin-generator-list-display.html</link>
		<comments>http://www.foolbirds.com/admin-generator-list-display.html#comments</comments>
		<pubDate>Wed, 24 Dec 2008 04:56:49 +0000</pubDate>
		<dc:creator>maker</dc:creator>
				<category><![CDATA[symfony]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[组件]]></category>

		<guid isPermaLink="false">http://symfony.bobhero.net/?p=220</guid>
		<description><![CDATA[在admin generator的list动作中， 我们可能希望在列表上加入自定义的列， symfony 1.2直接或间接的为我们提供了一些方法.

插入一个字段(field)
插入一个&#8221;虚拟字段&#8221;
插入局部模板(partial)
插入组件(component)

在generator.yml中, 我们可以修改list动作中列表显示的数据.
// 请将"."替换成" "
list:
..sort: [id, asc]
..display: [id, =name, _partial, ~component]
..max_per_page: 10
..object_actions:
....first_action:
......label: "first action"
......action: first
......params: class=className
...._edit: -
...._delete: -
sort项是list的动作的默认排序方式, display是行表行中要显示的基本数据, object_actions定义可以对该对象执行的操作.
这里我们重点讲解display, display定义要在list行中显示的对象属性或者自定义内容, 其元素可以是以&#8221;_&#8221;开头的局部模板名, 也可以是以&#8221;~&#8221;开头的组件名, 或者是一个字段名, 字段名前面也可以以&#8221;=&#8221;开头, 表示该字段是一个指向编辑页面的链接.
我们所说的字段名, 其实并不是真正意义上的数据库字段, 而是对象中的getter方法, 也就是说, 我们要显示在list中的字段, 并不一定要在数据库中真是存在.
下面看一个例子:
__ schema.yml __
propel:
..shop:
....__attributes: { phpName: Shop }
....id:
....name:         { type: varchar(60), required:true }
__ generator.yml __
list:
..sort: [...]]]></description>
			<content:encoded><![CDATA[<p>在admin generator的list动作中， 我们可能希望在列表上加入自定义的列， symfony 1.2直接或间接的为我们提供了一些方法.</p>
<ol>
<li>插入一个字段(field)</li>
<li>插入一个&#8221;虚拟字段&#8221;</li>
<li>插入局部模板(partial)</li>
<li>插入组件(component)</li>
</ol>
<p>在generator.yml中, 我们可以修改list动作中列表显示的数据.</p>
<pre name="code" class="php">// 请将"."替换成" "
list:
..sort: [id, asc]
..display: [id, =name, _partial, ~component]
..max_per_page: 10
..object_actions:
....first_action:
......label: "first action"
......action: first
......params: class=className
...._edit: -
...._delete: -</pre>
<p>sort项是list的动作的默认排序方式, display是行表行中要显示的基本数据, object_actions定义可以对该对象执行的操作.</p>
<p>这里我们重点讲解display, display定义要在list行中显示的对象属性或者自定义内容, 其元素可以是以&#8221;_&#8221;开头的局部模板名, 也可以是以&#8221;~&#8221;开头的组件名, 或者是一个字段名, 字段名前面也可以以&#8221;=&#8221;开头, 表示该字段是一个指向编辑页面的链接.</p>
<p>我们所说的字段名, 其实并不是真正意义上的数据库字段, 而是对象中的getter方法, 也就是说, 我们要显示在list中的字段, 并不一定要在数据库中真是存在.</p>
<p>下面看一个例子:</p>
<p>__ schema.yml __</p>
<pre name="code" class="php">propel:
..shop:
....__attributes: { phpName: Shop }
....id:
....name:         { type: varchar(60), required:true }</pre>
<p>__ generator.yml __</p>
<pre name="code" class="php">list:
..sort: [id, asc]
..display: [id, =name, description]
..max_per_page: 10
..object_actions:
...._edit: -
...._delete: -</pre>
<p>在generator.yml的list动作的display项中, description字段是在数据库中并不存在的, 所以我们要在shop对象中添加如下方法:</p>
<p>__ /lib/model/Shop.php __</p>
<pre name="code" class="php">// 被注释掉的代码是标准的getter和setter应该有的部分, 但并不是我们例子中必须的.
public function getDescription()
{
//  return $this-&gt;description;
return "some description";
}

//public function setDescription($value)
//{
//  $this-&gt;description = $value;
//}</pre>
<p>这样, 我们就在shop/list的每一行都加了一个内容为&#8221;some description&#8221;的列.</p>
<p>可能很多人象bobhero一样, 不想去创建一个模板, 其实我也不想, 但我更不想多写很多代码, 因为我比较懒, 所以我使用了下面的方法来实现和上面一样的功能.</p>
<p>__ generator.yml __</p>
<pre name="code" class="php">list:
..sort: [id, asc]
..display: [id, =name, ~description]
..max_per_page: 10
..object_actions:
...._edit: -
...._delete: -</pre>
<p>~description, 前面说过以&#8221;~&#8221;开头的元素是一个组件, 那么我们建立下面的组件.</p>
<pre name="code" class="php">__ /apps/app/modules/shop/actions/components.class.php __

&lt;?php
class shopComponents extends sfComponents
{
public function executeDescription(sfWebRequest $request)
{
echo "some description";
return sfView::NONE;// 这句为了使组件不调用模板, 因为组件和动作一样, 会自动调用相应的模板.
}
}</pre>
<p>虽然上面的方法都达到了相同的效果, 但实际上还是有很大区别的, 组件更适合用于复杂的逻辑处理, 而getter却显得很吃力.</p>
<p>有了描述之后, 可能我们还想给商店加个图标, 我们可以使用局部模板来实现, 修改generator.yml如下.</p>
<p>__ generator.yml __</p>
<pre name="code" class="php">list:
..sort: [id, asc]
..display: [_logo, id, =name, description]
..max_per_page: 10
..object_actions:
...._edit: -
...._delete: -</pre>
<p>之后我们创建模板/apps/app/modules/shop/templates/_logo.php</p>
<p>__ /apps/app/modules/shop/templates/_logo.php __</p>
<pre name="code" class="php">&lt;?php echo img_tag($shop-&gt;getId().".gif");?&gt;</pre>
<p>这样我们在每列的id前面加入了一个以id命名的gif图片, 当然图片是要上传的, 至于如何上传图片不在本文的讨论范围之内, 可以搜索本站的其他文章.</p>
<ul class="related_post"><li><a href="http://www.foolbirds.com/generate-admin-templates-structure.html" title="symfony1.2的后台(generate-admin)模板结构">symfony1.2的后台(generate-admin)模板结构</a></li><li><a href="http://www.foolbirds.com/partial-and-layout.html" title="局部模板和全局模板">局部模板和全局模板</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.foolbirds.com/admin-generator-list-display.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
