章14 -发电机
许多应用程序都是基于数据存储在一个数据库,并提供一个接口来访问它。ob娱乐下载Symfony的重复性任务自动创建一个模块提供数据操作功能基于推动对象。如果你的对象模型是正确定义,symfony甚至可以自动生成整个网站管理。ob娱乐下载本章将告诉你两个发电机捆绑在symfony:脚手架和管理发电机。ob娱乐下载后者依赖于一个特殊的配置文件与一个完整的语法,所以大部分本章描述了政府发电机的各种可能性。
基于模型的代码生成
在web应用程序中,数据访问操作可以归类为以下之一:
- 创造一个记录
- 检索记录
- 更新的记录(和修改的列)
- 删除的记录
这些操作是如此常见,他们有专门的缩写:CRUD。许多页面可以简化为其中之一。例如,在论坛应用程序中,最新文章列表检索操作,和回复帖子对应于一个创建操作。
基本操作和模板实现CRUD操作对于一个给定的表反复中创建web应用程序。在syob娱乐下载mfony中,模型层包含足够的信息来允许生成CRUD操作代码,以便加快发展初期或后端接口。
基于模型的代码生成所有任务创建一个完整的模块,和结果从一个调用到形状的symfony命令行如下:ob娱乐下载
> ob娱乐下载symfony < TASK_NAME > < APP_NAME > < MODULE_NAME > < CLASS_NAME >
代码生成任务propel-init-crud
,propel-generate-crud
,propel-init-admin
。
脚手架和管理
在应用程序开发过程中,代码生成可用于两种不同的用途:
- 脚手架是所需的基本结构(行动和模板)CRUD操作在给定的表。代码是最小的,因为它是作为进一步发展的指导方针。开始,这是一个基础,必须适应匹配你的逻辑和表示需求。脚手架主要是在开发阶段使用,提供一个web access数据库,建立一个原型,或引导模块主要基于一个表。
- 管理是一个复杂的数据操作接口,用于后端管理。政府不同于脚手架因为他们的代码不是要手动修改。他们可以定制、扩展或组装通过配置或继承。他们的表现是很重要的,他们利用额外的功能,如排序、分页和过滤。可以创建管理和移交给客户完成软件产品的一部分。
symfob娱乐下载ony命令行用法的crud指定脚手架、和管理员管理。
启动或生成代码
ob娱乐下载Symfony提供了两种方法来生成代码:通过继承(初始化
)或通过代码生成(生成
)。
您可以启动模块,创建空的类继承的框架。这面具动作的PHP代码和模板,以避免被修改。这是有用的,如果你的数据结构不是决赛,或者如果你只是需要一个快速接口数据库操作记录。在运行时执行的代码不是位于您的应用程序,但在缓存中。命令行任务这样的一代开始propel-init -
。
启动操作代码是空的。例如,一个开始文章
模块的行为看起来像这样:
类articleActions扩展autoarticleActions{}
另一方面,您还可以生成代码的行为和模板,以便它可以被修改。因此产生的模块独立于框架的类,并使用配置文件不能修改。命令行任务这样的一代开始propel-generate -
。
脚手架的建立为进一步发展作为基础,最好是生成一个脚手架。另一方面,政府应该很容易通过改变配置更新,和它应该仍然可用,即使数据模型的变化。这就是为什么政府发起的。
示例数据模型
在这一章,上市公司将展示symfony生成器的功能基于一个简单的例子,这将提醒你第八章。ob娱乐下载这是著名的博客应用程序的例子,包含两个文章
和评论
类。清单赔率显示模式,见图赔率。
清单赔率-schema.yml
Weblog应用程序的例子
推动:blog_article: _attributes: {phpName:文章}id:标题:varchar(255)内容:用longvarchar created_at: blog_comment: _attributes: {} phpName:评论id: article_id:作者:varchar(255)内容:用longvarchar created_at:
图赔率——示例数据模型
没有特定的规则遵循模式创建期间允许代码生成。ob娱乐下载Symfony将使用模式和解释它的属性来生成一个脚手架或管理。
提示
本章的,你需要做的例子。你会得到一个更好的理解什么symfony与生成的代码生成和能够做什么如果你有一个清单中描ob娱乐下载述的每一步。所以你被邀请来创建一个数据结构,如前面描述的那样,创建一个数据库和一个blog_article
和一个blog_comment
表,并与样本数据来填充这个数据库。
脚手架
脚手架的使用在早期的应用程序开发。一个命令,symfony创建整个模块根据给定的ob娱乐下载描述表。
生成一个脚手架
生成的脚手架文章
模块的基础上文章
模型类,输入以下:
> ob娱乐下载symfony propel-generate-crud myapp文章文章
ob娱乐下载Symfony读取的定义文章
类的schema.yml
和创建一组模板和行动在此基础上,myapp /模块/ /条
目录中。
生成的模块包含三个观点。的列表
看来,默认视图,显示的行blog_article
表在浏览http://localhost/myapp_dev.php/article
如图比分为转载。
图——希望药厂列表
的观点文章
模块
点击显示一篇文章标识符显示
视图。一行的细节出现在一个页面中,如图14所示。
图14 -显示
的观点文章
模块
编辑一篇文章通过单击edit链接,或者创建一个新的文章通过单击创建链接列表
视图,显示了编辑
看来,复制图支持。
使用这个模块,您可以创建新的文章,修改或删除现有的。生成的代码为进一步发展是一个很好的基础。清单列表生成的行为希望药厂和模板的新模块。
图以14 -编辑
的观点文章
模块
清单比分- CRUD生成元素,在myapp /模块/ /条
/ /动作/ actions.class。php指数/ /转发列表下面的行动/ /显示所有表的记录显示的列表/ /显示的所有列的列表记录编辑/ /显示一个表单,修改的列的记录更新/ /行动称为编辑动作形式删除/ /删除一条记录创建/ /创建一个新的记录/ /模板/ editSuccess。php / /记录(编辑视图)listSuccess版形式。php / /列表(列表视图)showSuccess所有记录。php / /一条记录的细节(显示视图)
这些行动和模板的逻辑非常简单和明确的,因此而不是繁殖并解释这一切,清单14给出了一个生成的action类先睹为快。
清单14 - Action类生成,myapp /模块/文章/行动/ actions.class.php
类articleActions扩展sfActions{公共函数executeIndex(){返回这个美元- >向前(“文章”,“列表”);}公共函数executeList(){这个美元- >文章= ArticlePeer::doSelect(新标准());}公共函数executeShow(){这个美元- >文章= ArticlePeer::retrieveByPk(这个美元- >getRequestParameter(“id”));这个美元- >forward404Unless(这个美元- >文章);}…
修改生成的代码,以满足您的需求,对所有的表重复CRUD生成你想要互动,并且你已经有了一个基本的运行应用程序。生成一个脚手架真的出人头地发展;让symob娱乐下载fony做肮脏的工作,专注于接口和细节。
初始化一个脚手架
启动一个脚手架主要是有用的,当你需要检查,你可以访问数据库中的数据。快速构建和也快速删除一旦你确定,一切工作正常。
创建一个启动推动脚手架文章
模块处理的记录文章
模型类名称,类型如下:
> ob娱乐下载symfony propel-init-crud myapp文章文章
然后,您可以访问列表
视图使用默认动作:
http://localhost/myapp_dev.php/article
产生的页面生成脚手架一模一样。您可以使用它们作为一个简单的web界面到数据库。
如果你检查新创建的actions.class.php
在文章
模块中,您会看到它是空的:一切都继承自一个自动生成的类。同样的模板:模板文件中是不存在的模板/
目录中。发起行动背后的代码和模板生成脚手架是一样的,但是只在于应用程序缓存(myproject /缓存/ myapp /刺激/模块/ autoArticle /
)。
在应用程序开发过程中,开发人员开始脚手架与数据交互,不管界面。代码不是定制的;一个启动脚手架可以被视为一个简单的替代PHPmyadmin管理数据。
政府
ob娱乐下载仍然Symfony可以产生更高级的模块,基于模型的类定义schema.yml
文件,为您的应用程序的后端。您可以创建一个整个站点管理只有生成管理模块。这一节将描述的例子管理模块添加到后端
应用程序。如果你的项目没有后端
现在,通过调用应用程序,创建它的骨架init-app
任务:
> ob娱乐下载symfony init-app后端
管理模块解释模型的一个特殊的配置文件generator.yml
,可以改变延长所有生成的组件和模块的外观和感觉。这样的模块通常受益于模块前面章节中描述机制(布局、验证、路由、自定义配置,半自动的,等等)。你也可以覆盖生成的行动或模板,为了自己的功能集成到生成的管理,但是generator.yml
应该照顾最常见的需求和限制使用PHP代码只有非常具体。
启动一个管理模块
使用symob娱乐下载fony,您构建一个政府如果基础上。一个模块生成基于推动对象使用propel-init-admin
任务,它使用语法类似于用于启动一个脚手架:
> ob娱乐下载symfony propel-init-admin后台文章文章
这叫足以创建一个文章
模块的后端
应用程序的基础上文章
类定义,可以通过以下:
http://localhost/backend.php/article
生成模块的外观和感觉,见图第4和14,足够复杂,使其可用的商业应用。
图第4 -列表
的观点文章
模块的后端
应用程序
图14 -编辑
的观点文章
模块的后端
应用程序
脚手架的接口之间的区别的一个政府现在可能看起来不重要,但政府将允许您的可配置性增强的基本布局增加了许多额外功能,没有行PHP。
请注意
管理模块只能发起(不生成)。
看看生成的代码
本文的代码管理模块,应用程序/后端/模块/文章/
目录是空的,因为它仅仅是开始。最好的方法回顾这个模块的生成的代码是使用浏览器与它交互,然后检查的内容缓存/
文件夹中。支持清单列表生成的行动和模板缓存中找到。
清单以14 -管理元素,生成缓存/后端/ ENV /模块/文章/
/ /动作/ actions.class。php创建/向前/删除/编辑/删除一条记录编辑/ /显示一个表单修改字段的记录/ /和处理表单提交索引/ /转发列表/ /列表显示所有表的记录保存/向前/编辑/ /模板/ _edit_actions。php _edit_footer.php_edit_form.php_edit_header.php_edit_messages.php _filters.php _list.php _list_actions.php _list_footer.php _list_header.php _list_messages.php _list_td_actions.php _list_td_stacked.php _list_td_tabular.php _list_th_stacked.php _list_th_tabular.php editSuccess.php listSuccess.php
这表明一个生成管理模块主要是由两种不同的观点,编辑
和列表
。如果你看一下代码,你会发现它非常模块化的,可读和可扩展的。
介绍了发电机。yml配置文件
脚手架和政府之间的主要区别(除了administration-generated模块没有的事实显示
行动)是一个管理依赖于参数中发现的generator.yml
YAML配置文件。看到新创建的默认配置管理模块,打开generator.yml
文件,位于后端/模块/文章/ config / generator.yml
目录和复制清单甚佳。
清单第4 -默认发电机配置后端/模块/文章/ config / generator.yml
发电机:类:sfPropelAdminGenerator参数:model_class:文章主题:违约
这个配置是足以产生的基本管理。任何自定义添加下参数
键,后主题
线(这意味着增加底部的所有行generator.yml
文件必须至少一开始有四个空格是正确的缩进)。清单14显示了一个典型的定制generator.yml
。
清单14——典型完整的发电机配置
发电机:类:sfPropelAdminGenerator参数:model_class:文章主题:默认字段:author_id:{名称:文章作者}列表:标题:显示所有文章列表:[标题、author_id category_id添加]字段:published_on:{参数:date_format = dd / MM / yy的}布局:堆参数:| % % is_published % % <强> % % =标题% % < /强> < br / > < em >作者% % % % % %类别% % (% % published_on % %) < / em > < p > % % content_summary % % < / p >过滤器:[标题、category_id添加author_id, is_published] max_per_page: 2编辑:标题:编辑文章“% % % %”显示:“Post”:[标题、category_id添加内容]“工作流”:[author_id、is_published created_on]字段:category_id添加:{参数:禁用= true} is_published:{类型:普通}created_on:{类型:平原,参数:date_format = ' dd / MM / yy} author_id:{参数:尺寸= 5 include_custom = > >作者选择一个< <}published_on:{凭证:}内容:{参数:丰富= true tinymce_options =身高:150}
下面的章节详细解释所有的参数,可以使用这个配置文件。
发电机的配置
发电机的配置文件是非常强大的,允许你改变生成的政府在很多方面。但这种能力有一个价格:整体语法描述长时间阅读和学习,使这一章书中最长的一个。symfob娱乐下载ony网站提出了一个额外的资源,将帮助您学习该语法:政府生成器小抄,复制图数。下载它从/上传/资产/ sfAdminGeneratorRefCard.pdf,使它接近你当你阅读本章下面的例子。
本节将调整的例子文章
管理模块,以及评论
管理模块,基于评论
类定义。创建后者propel-init-admin
任务:
> ob娱乐下载symfony propel-init-admin端评论发表评论
图数-政府发电机备忘单
字段
默认情况下,列的列表
视图的字段编辑
视图中定义的列schema.yml
。与generator.yml
,您可以选择显示哪些字段,哪些是隐藏的,并添加自己的领域,即使他们没有直接对应的对象模型。
字段设置
政府生成器创建一个场
的每一列schema.yml
文件。下字段
键,您可以修改每个字段显示的方式,格式化,等。例如,清单中显示的字段设置数定义一个自定义标签类和输入类型标题
的领域,一个标签和一个工具提示内容
字段。下面的部分将详细描述每个参数是如何工作的。
清单列数,设置一个自定义标签
发电机:类:sfPropelAdminGenerator参数:model_class:文章主题:默认字段:标题:{名称:文章标题、类型:textarea_tag,参数:类= foo}内容:{名称:身体,帮助:填写文章身体}
除了这个默认定义的视图,您可以重写字段设置为给定的视图(列表
和编辑
),如清单。是每天奋斗所示
清单——最重要的是每天奋斗全局设置视图/视图
发电机:类:sfPropelAdminGenerator参数:model_class:文章主题:默认字段:标题:{名称:文章标题}内容:{名称:身体}列表:字段:标题:{名称:标题}编辑:字段:内容:{文章的名字:身体}
这是一个一般原则:任何设置,设置为整个模块下字段
键可以覆盖视图相关(列表
和编辑
)区域。
将字段添加到显示
你定义的字段字段
部分可以显示、隐藏命令,分组以各种方式为每个视图。的显示
关键是用于这一目的。例如,安排的字段评论
模块,使用的代码清单的战绩。
清单的战绩——选择要显示的字段模块/评论/ config / generator.yml
发电机:类:sfPropelAdminGenerator参数:model_class:评论主题:默认字段:article_id:{名称:文章}created_at:{名称:发表在}内容:{名称:身体}列表:显示:[id、article_id内容]编辑:显示:没有:[article_id]编辑:[作者、内容、created_at]
的列表
将显示三列,如图,是每天奋斗的吗编辑
形式将显示四个字段,聚集在两组,如图的战绩。
图-自定义列设置是每天奋斗列表
的观点评论
模块
图的战绩——分组字段编辑
的观点评论
模块
所以你可以使用显示
设置在两个方面:
- 选择显示的列,它们出现的顺序,把字段在一个简单的数组——在前面
列表
视图。 - 进行分组字段,使用关联数组组名称作为键,或
没有一个
一群没有名字。命令列名称的价值仍然是一个数组。
提示
默认情况下,主键列从未出现在任何视图列表视图。
自定义字段
事实上,中配置的字段generator.yml
甚至不需要对应于实际的模式中定义的列。如果相关的类提供了一个定制的getter,它可以用作一个字段列表
视图;如果有一个getter或setter,它也可以使用的编辑
视图。例如,您可以扩展文章
模型与一个getNbComments ()
方法类似于一个清单14-10。
清单14-10——在模型中添加一个自定义的Getterlib /模型/ Article.php
公共函数getNbComments(){返回这个美元- >countComments();}
然后nb_comments
可以作为字段生成模块(注意getter使用camelCase版本的字段名),如清单14-11所示。
清单14-11 -自定义getter管理模块,提供额外的列后端/模块/文章/ config / generator.yml
发电机:类:sfPropelAdminGenerator参数:model_class:文章主题:默认列表:显示:[id、标题、nb_comments created_at]
由此产生的列表
的观点文章
模块如图14-10。
图14-10——自定义字段列表
的观点文章
模块
定制字段甚至可以返回HTML代码来显示超过原始数据。例如,您可以扩展评论
类getArticleLink ()
方法如清单14-12所示。
清单14-12 -添加一个自定义的Getter返回HTML,lib /模型/ Comment.class.php
公共函数getArticleLink(){返回link_to(这个美元- >getArticle()- >getTitle(),“文章/编辑? id =”。这个美元- >getArticleId());}
您可以使用这个新的getter的自定义字段评论/列表
视图与清单14-11相同的语法。看到清单14-13中的示例,结果在图14-11中,HTML代码的输出通过getter(超链接文章)出现在文章的第二列而不是主键。
清单14-13 -自定义getter返回HTML也可以用作附加列,模块/评论/ config / generator.yml
发电机:类:sfPropelAdminGenerator参数:model_class:评论主题:默认列表:显示:[id、article_link内容]
图14-11——自定义字段列表
的观点评论
模块
部分字段
必须独立于代码位于模型表示。的例子getArticleLink ()
方法早期不尊重这层分离的原则,因为一些视图代码出现在模型层。实现相同的目标在一个正确的方法,你最好把自定义字段的HTML代码,输出部分。幸运的是,政府生成器允许如果你声明一个字段名使用下划线前缀。在这种情况下,generator.yml
要修改文件的清单14-13如清单14-14所示。
清单14-14 -泛音可以用作附加列——使用_
前缀
列表:显示:[id、_article_link created_at]
为此,一个_article_link.php
部分必须被创建模块/评论/模板/
目录,如清单14所示。
清单14日至15日,部分的示例列表
看来,在模块/评论/模板/ _article_link.php
< ? php回声link_to(美元的评论- >getArticle()- >getTitle(),“文章/编辑? id =”。美元的评论- >getArticleId()) ?>
注意,部分领域的局部模板可以访问当前对象通过一个变量命名的类(美元的评论
在本例中)。例如,对于一个模块为一个类调用UserGroup
,部分通过将获得当前对象user_group美元
变量。
结果如图14-11是一样的,除了层分离是尊重。如果你习惯尊重层分离,最终你会更易于维护的应用程序。
如果你需要定制的参数部分,做一样正常,下场
关键。只是不包括前导下划线(_
)的关键,见清单14 - 16中的一个例子。
清单14 - 16 -部分下可以定制字段属性字段
关键
字段:article_link:{名称:文章}
如果你的部分就挤满了逻辑,你可能想要把它换成一个组件。改变_
前缀~
,你可以定义一个组件,如清单14至17中可以看到。
清单14至17 -组件可以作为附加列——使用~
前缀
…列表:显示:[id、~ article_link created_at]
在生成的模板,这将调用的结果articleLink
当前模块的组件。
请注意
可用于自定义和部分字段列表
看来,编辑
视图和过滤器。如果你使用相同的部分几个观点,上下文(“列表”
,“编辑”
,或“过滤”
)存储在美元的类型
变量。
视图定制
改变编辑
和列表
视图的外观,你可以会改变模板。而是因为他们是自动生成的,这样做并不是一个很好的主意。相反,您应该使用generator.yml
配置文件,因为它几乎可以做所有你需要在不牺牲模块化。
改变视图的标题
除了一套自定义的字段列表
和编辑
页面可以自定义页面标题。例如,如果你想要定制的标题文章
视图,如清单14 - 18所示。由此产生的编辑
视图如图14-12所示。
清单14 - 18 -设置一个自定义标题为每个视图后端/模块/文章/ config / generator.yml
列表:标题:物品清单……编辑:标题:身体的% % % %显示标题条[内容]
图14-12——自定义标题编辑
的观点文章
模块
作为默认标题使用类名,他们通常足够好——前提是你的模型使用显式的类名。
提示
的字符串值generator.yml
,一个字段的值可以通过访问包围的名称字段% %
。
增加工具提示
在列表
和编辑
视图,您可以添加帮助描述字段显示工具提示。例如,添加一个工具提示article_id
场的编辑
的观点评论
模块,添加一个帮助
财产的字段
14 - 19的定义如清单。结果如图14-13。
14 - 19清单——设置的工具提示编辑
看来,在模块/评论/ config / generator.yml
编辑:字段:…article_id:{帮助:当前涉及到本文发表评论}
图14-13——工具提示编辑
的观点评论
模块
在列表
视图,工具提示显示在列标题;在编辑
看来,他们出现在输入。
修改日期格式
可以使用自定义格式显示日期一旦你使用date_format
参数,如清单14到20所示。
清单14到20 -格式化的日期列表
视图
列表字段:created_at:{名称:出版,参数:date_format =“dd / MM”}
需要相同的格式参数format_date ()
前一章中描述的助手。
侧边栏
管理模板i18N准备好了
所有的文本中自动国际化(即生成的模板。,封装在一个调用__ ()
助手)。这意味着您可以轻松地将生成的政府通过添加翻译短语的XLIFF文件,在你应用程序/ myapp / i18n /
目录中,在前一章解释。
列表视图相关的定制
的列表
视图可以显示的细节记录表格的方式,和所有的细节在一行。它还包含过滤器、分页和排序功能。这些特性可以改变配置,接下来的部分将描述。
改变布局
默认情况下,之间的超链接列表
视图和编辑
视图是由主键列。如果你回头参照图14-11,你将会看到id
列在评论列表不仅显示了每个评论的主键,但也提供了一个超链接,允许用户访问编辑
视图。
如果你喜欢超链接的细节记录出现在另一个列,列名前缀由一个等号(=
)显示
关键。清单的程度显示了如何删除id
从显示的字段的评论列表
并把超链接内容
字段。检查图14-14截图。
清单的程度-移动的超链接编辑
视图的列表
看来,在模块/评论/ config / generator.yml
列表:显示(article_link =内容):
图14-14 -移动的链接编辑
对另一个列,列表
的观点评论
模块
默认情况下,列表
视图使用表格
布局,字段显示为列,如图所示。但是您还可以使用堆放
布局和字段合并到一个字符串扩展完整的表。如果你选择堆放
布局,必须设置参数个数
关键的模式定义列表的每一行的值。例如,清单14-22定义了一堆评论模块的列表视图布局。结果出现在图14日至15日。
清单14-22——使用堆放
布局的列表
看来,在模块/评论/ config / generator.yml
列表:布局:堆参数:| % % % % =内容< br / >(派作者% % % % % % created_at % % % % article_link % %)显示:(created_at、作者、内容)
图14日至15日,堆叠的布局列表
的观点评论
模块
请注意,一个表格
布局预计以下字段的数组显示
关键,但堆放
布局使用参数个数
为每个记录生成的HTML代码的关键。然而,显示
数组中仍在使用堆放
布局,以确定哪些列标题可用于交互式排序。
筛选结果
在一个列表
视图中,您可以添加一组过滤器交互。有了这些过滤器,用户可以显示更少的结果和获得他们想要的更快。配置下的过滤器过滤器
关键,字段名称的数组。例如,添加一个过滤器article_id
,作者
,created_at
字段来评论列表
视图,如清单5所示,显示一个过滤箱类似于图14 - 16所示。您需要添加一个__toString ()
方法文章
类(例如,返回标题
为这个工作)。
清单5 -设置过滤器列表
看来,在模块/评论/ config / generator.yml
列表:过滤器:[article_id、作者、created_at]布局:堆参数:| % % % % =内容< br / >(派作者% % % % % % created_at % % % % article_link % %)显示:(created_at、作者、内容)
图14 - 16 -过滤器列表
的观点评论
模块
symfony的过滤器显示取决于列类型:ob娱乐下载
- (如文本列
作者
字段评论
模块),过滤器是一个文本输入允许文本搜索通配符(*
)。 - 外键(如
article_id
字段评论
模块),过滤器是一个记录的相关表的下拉列表。至于定期object_select_tag ()
下拉列表的选项是返回的__toString ()
相关的类的方法。 - 日期列(如
created_at
字段评论
模块),过滤器是一对富裕的日期标签(文本字段由日历小部件),允许选择的时间间隔。 - 对于布尔列,过滤器是一个下拉列表
真正的
,假
,真或假
选项——最后一个值重新初始化过滤器。
就像你使用部分字段列表,你也可以使用部分过滤器创建一个过滤器,symfony不处理。ob娱乐下载例如,想象一个状态
字段可能只包含两个值(开放
和关闭
),但是由于某些原因你这些值直接存储在字段,而不是使用一个表关系。一个简单的过滤这个字段的类型字符串
)是一个基于文本的搜索,但您可能想要的是一个下拉列表值。很容易实现局部滤波器。参见清单14 - 24的一个示例实现。
清单14 - 24 -使用部分过滤器
/ /定义部分,在模板/ _state.php< ? php回声select_tag(“过滤器[状态]”,options_for_select(数组(”= >”,“开放”= >“开放”,“关闭”= >“关闭”,),收取(美元的过滤器(“状态”])吗?美元的过滤器(“状态”]:”))? >/ /添加部分过滤器在过滤器列表中,在配置/ generator.yml列表过滤器:(日期,_state]
请注意,部分访问美元的过滤器
变量,它是有用的过滤器的当前值。
有最后一个选项,可以为寻找空值是非常有用的。想象一下你想过滤评论列表只显示那些没有作者。问题是,如果你把作者过滤空,它将被忽略。解决这个问题的办法是设置filter_is_empty
字段设置为true,如清单14-25,过滤器将显示一个额外的复选框,将允许您寻找空值,如图14 - 17。
清单14-25 -添加过滤的空值作者
字段列表
视图
列表字段:作者:{filter_is_empty:真}过滤器:[article_id、作者、created_at]
图14 - 17 -允许空的过滤作者
值
排序的列表
在一个列表
看来,表头是超链接,可以用来重新排序列表,如图14 - 18。这些标题的显示表格
和堆放
布局。点击这些链接,重新加载页面排序
相应参数,重新订单列表。
图14 - 18的表头列表
视图是控制
您可以重用的语法直接指向列表排序根据一列:
< ? php回声link_to(评论列表按日期的,的评论/列表? = created_at&type = desc排序”)? >
您还可以定义一个默认的排序
订单的列表
视图中直接generator.yml
文件。语法的例子在清单14日至26日。
清单14日至26日,排序字段设置默认值列表
视图
列表:排序:created_at #替代语法,指定一个排序顺序:[created_at, desc)
请注意
只有一个实际列对应的字段转换为控制——而不是自定义或部分字段进行排序。
自定义分页
生成的甚至政府有效地处理大型表,因为列表
默认视图使用分页。当实际的表中的行数超过最大的数量每页行数,分页控件出现在列表的底部。例如,14 - 19图显示了列表的评论与六个测试评论表但限制每页显示5个评论。分页确保良好的性能,因为只有显示行有效地从数据库检索,和良好的可用性,因为即使表数以百万计的行可以由一个管理模块。
14 - 19图——分页控件出现在长列表
你可以定制的数量记录在每个页面显示max_per_page
参数:
列表:max_per_page: 5
使用页面加入加速交付
默认情况下,发电机使用一个简单的管理doSelect ()
检索记录的列表。,但如果你使用列表中的相关对象,所需要的数据库查询数显示列表可能会迅速增加。例如,如果您想要显示的名称列表中的条评论,需要额外的查询每个帖子列表中检索相关的文章
对象。所以你可能想要迫使寻呼机的使用doSelectJoinXXX ()
方法来优化查询的数量。这可以指定peer_method
参数。
列表:peer_method: doSelectJoinArticle
第18章解释了加入更广泛的概念。
编辑视图相关的定制
在一个编辑
视图中,用户可以修改每个列的值对于一个给定的记录。ob娱乐下载Symfony确定类型的输入显示列的数据类型。然后生成一个object_ * _tag ()
助手,通过辅助对象和属性编辑。例如,如果这篇文章编辑
规定,用户可以编辑视图配置标题
字段:
编辑:显示:(标题,……)
然后编辑
页面将显示一个普通文本输入标签编辑标题
因为这列被定义为一个varchar
输入模式。
< ? php回声object_input_tag(美元的文章,“getTitle”)? >
改变输入类型
默认type-to-field转换规则如下:
- 一列定义为
整数
,浮动
,字符
,varchar(大小)
出现在编辑
视图作为一个object_input_tag ()
。 - 一列定义为
用longvarchar
显示为一个object_textarea_tag ()
。 - 一个外键列显示为一个
object_select_tag ()
。 - 一列定义为
布尔
显示为一个object_checkbox_tag ()
。 - 定义为一列
时间戳
或日期
显示为一个object_input_date_tag ()
。
你可能想要覆盖这些规则为给定的字段指定一个自定义的输入类型。程度,设置类型
参数字段
定义一个特定的形式助手的名字。至于选项生成的object_ * _tag ()
,你可以改变参数的参数。清单14-27中看到的一个例子。
清单14-27 -设置一个自定义的输入类型和参数编辑
视图
发电机:类:sfPropelAdminGenerator参数:model_class:评论主题:默认编辑:字段:# #把输入,只是纯文本显示id:{类型:普通}# #输入没有可编辑的作者:{参数:禁用= true} # #输入是一个文本区域(object_textarea_tag)内容:{类型:textarea_tag参数:用户丰富的css = = true。css tinymce_options =宽度:330}# #输入是一个选择(object_select_tag) article_id:{参数:include_custom =选择一篇}…
参数的参数传递选项来生成的object_ * _tag ()
。例如,参数个数
定义前article_id
将生成的模板如下:
< ? php回声object_select_tag($comment, 'getArticleId', 'related_class=Article', 'include_custom=Choose an article') ?>
这意味着所有可用的选项通常助手可以定制的编辑
视图。
处理部分字段
可用于部分字段编辑
观点就像在列表
的观点。不同之处在于,你必须手工处理,在行动,显示列的更新部分发送的请求参数的值字段。ob娱乐下载Symfony知道如何处理正常的字段(对应于实际列),但不能猜你如何处理输入可能包括在部分领域。
例如,想象一个管理模块用户
类可用字段在哪里id
,昵称
,密码
。站点管理员必须能够根据要求更改用户的密码,但是编辑
视图不显示密码字段的值,是为了安全起见。相反,表单应该显示一个空的密码输入,网站管理员可以填补改变的价值。对于这样一个生成器设置编辑
然后,类似于清单14-28视图。
清单14-28——包括部分字段编辑
视图
编辑:显示:[id、昵称_newpassword]字段:newpassword:{名称:密码,帮助:输入一个密码改变它,离开字段空白保持当前}
的模板/ _newpassword.php
部分包含这样的:
< ? php回声input_password_tag(“newpassword”,”)? >
注意到这个部分使用一个简单的辅助形式,不是一个helper对象形式,因为它是不可取的,从当前检索密码值用户
对象来填充表单输入——这可能披露用户密码。
现在,为了使用这个控制更新的值对象的行动,您需要扩展updateUserFromRequest ()
方法采取行动。为此,创建一个具有相同名称的方法操作类文件中自定义行为的输入部分字段,如清单14-29所示。
清单14-29 -处理行动,部分字段模块/ user /行动/ actions.class.php
类userActions扩展autouserActions{受保护的函数updateUserFromRequest(){/ /处理部分的输入字段美元的密码=这个美元- >getRequestParameter(“newpassword”);如果(美元的密码){这个美元- >用户- >向setPassword(美元的密码);}/ /让symob娱乐下载fony处理其他字段父::updateUserFromRequest();}}
请注意
在现实世界中,一个用户/编辑
视图通常包含两个密码字段,第二必须匹配第一个以避免输入错误。在实践中,正如您在第十章中看到的,这是通过一个验证器。administration-generated模块受益于这种机制就像普通模块。
处理外键
如果您的模式定义表之间的关系,利用生成的管理模块,提供更多的自动化控制,从而极大地简化了关系管理。
一对多关系
其它表的关系是由政府照顾的发电机。之前是由图赔率的,blog_comment
桌子是相关的blog_article
表通过article_id
字段。如果你发起的模块评论
类管理发电机,评论/编辑
行动将会自动显示article_id
作为一个下拉列表显示可用的记录的idblog_article
表(图的战绩再次检查了一个插图)。
此外,如果你定义一个__toString ()
方法文章
类,下拉选项使用它的文本而不是主键。
如果你需要显示的列表相关的一篇文章的评论文章
模块(n - 1)的关系,你需要定制模块的部分字段。
多对多关系
ob娱乐下载Symfony还负责n n表关系,但既然你不能定义的模式,您需要添加一些参数generator.yml
文件。
多对多关系的实现需要一个中间表。例如,如果有一个n n之间的关系blog_article
和一个blog_author
表(可以由不止一个作家写的一篇文章,很明显,一个作者可以编写多个文章),数据库总是最后一个表blog_article_author
或类似,如图14到20。
图14到20 -使用“类”来实现多对多关系
然后有一个类称为模型ArticleAuthor
,这是唯一政府发电机需求——但你必须通过它through_class
参数的字段。
例如,在一个生成模块的基础上文章
类,您可以添加一个字段创建新的n n协会作者
如果你写类generator.yml
如清单14-30所示。
清单14-30 -处理的多对多关系through_class
参数
编辑:字段:article_author:{类型:admin_double_list参数:through_class = ArticleAuthor}
这样的字段处理现有对象之间的联系,所以常规的下拉列表是不够的。你必须使用一种特殊类型的输入。ob娱乐下载Symfony提供了三个小部件来帮助联系两个列表的成员(见图的程度):
- 一个
admin_double_list
是一组两个扩展选择控制,按钮开关一起从第一个列表元素(元素)第二(选中的元素)。 - 一个
admin_select_list
是一个扩大选择控件,您可以选择许多元素。 - 一个
admin_check_list
是一个复选框列表标记。
图的程度,可用控制的多对多关系
添加交互
管理模块允许用户执行CRUD操作中常见的,但你也可以添加自己的观点或限制可能的交互的交互。例如,交互定义清单14-31提供访问所有默认的CRUD操作文章
模块。
清单14-31——为每个视图定义交互后端/模块/文章/ config / generator.yml
列表:标题:物品清单object_actions: _edit: ~ _delete: ~行动:_create: ~编辑:标题:文章标题% % % %的身体动作:_list: ~ _save: ~ _save_and_add: ~ _delete: ~
在一个列表
看来,有两个动作设置:每个对象的可用的行动列表,操作可用于整个页面的列表。列表清单14-31呈现在图中定义交互14-22。每一行显示一个按钮来编辑记录和删除它。在列表的底部,一个按钮允许创建一个新的记录。
图14-22——交互列表
视图
在一个编辑
看来,只有一个记录一次编辑,只有一组操作定义。的编辑
交互定义在清单14-31呈现在图5。这两个保存
和save_and_add
保存当前编辑的操作记录,区别在于,保存
行动显示了编辑
对当前记录在保存视图,而save_and_add
行动显示一个空编辑
添加另一个记录。的save_and_add
行动是一个快捷方式,你会发现非常有用当添加许多快速连续记录。的位置删除
行动,这是与其他按钮,以便用户不点击错误。
交互下划线开头的名称(_
)告诉symfob娱乐下载ony使用默认图标和行动对应于这些交互。政府发电机理解_edit
,_delete
,_list
,_save
,_save_and_add
,_create
。
图5 -交互编辑
视图
但是你也可以添加一个自定义的交互,在这种情况下,您必须指定一个名字从没有下划线,如清单14-32所示。
清单14-32 -定义一个自定义的交互
列表:标题:物品清单object_actions: _edit: - _delete: - addcomment:{名称:添加一个评论,行动:addcomment,图标:后端/ addcomment。png}
每一篇文章的列表将显示web /遗留/图片/ addcomment.png
按钮,如图24所示。点击触发调用addComment
行动在当前模块。当前对象的主键自动添加到请求参数。
图14 - 24 -自定义交互的列表
视图
的addComment
行动可以实现如清单14-33所示。
清单14-33 -实现自定义交互动作,行动/ actions.class.php
公共函数executeAddComment(){美元的评论=新评论();美元的评论- >setArticleId(这个美元- >getRequestParameter(“id”));美元的评论- >保存();这个美元- >重定向(“评论/编辑? id =”。美元的评论- >getId());}
关于行动的最后几句话:如果你想完全抑制一类的行为,使用一个空列表,如清单14-34。
清单14-34 -消除所有行动列表
视图
列表:标题:物品清单行动:{}
表单验证
如果你看看生成的_edit_form.php
模板在您的项目中缓存/
目录中,您将看到表单字段使用特殊的命名约定。在生成的编辑
视图,输入名字源于underscore-syntaxed串联的模型类名称和尖括号之间的字段名。
例如,如果编辑
视图文章
类都有一个标题
模板字段,将类似于清单14-35和字段将被确定为文章(标题)
。
清单14-35 -语法生成的输入名称
/ /发电机。yml发生器:类:sfPropelAdminGenerator参数:model_class:文章主题:默认编辑:显示:[标题]/ / _edit_form。php模板< ?php echo object_input_tag(美元,getTitle,数组(“control_name”= >“文章[标题]”))? > / /结果HTML < input type = " text " name = "[标题]条" id = " article_title value = "我的标题" / >
这个内部一些表单处理过程中有很多的优势。然而,随着第十章中解释,表单验证配置有点棘手,所以你必须改变方括号,(
]
花括号,{
}
,在字段
定义。此外,当使用字段名作为参数验证器,您应该使用这个名字,因为它出现在生成的HTML代码(也就是说,方括号,但在引号)。特殊的细节请参考清单14-36验证器生成语法形式。
清单14-36 Administration-Generated -验证器文件语法形式
# #花括号替换方括号的字段列表字段:{标题}条要求:味精:您必须提供一个标题# #验证器参数,使用原始的字段名之间引用sfCompareValidator:检查:“用户[newpassword]”compare_error:密码确认密码不匹配。
限制用户操作使用凭证
对于给定的管理模块,可以根据不同的可用字段和交互的凭证登录用户(参见第六章symfony的安全特性的描述)。ob娱乐下载
发电机可以的字段凭证
参数考虑进去,似乎只有用户适当的凭证。这适用于列表
视图和编辑
视图。此外,发电机也可以隐藏交互根据凭证。清单14-37演示了这些特性。
清单14-37——使用凭证generator.yml
# #显示id列只对具有管理凭据的用户列表:标题:文章列表布局:列表显示:[id =标题、内容、nb_comments]字段:id:{凭证:[管理]}# # addcomment交互仅限于具有管理凭据的用户列表:标题:物品清单object_actions: _edit: - _delete: - addcomment:{凭证:[管理],名称:添加一个评论,行动:addcomment,图标:后端/ addcomment。png}
修改生成模块的介绍
您可以修改表示生成的模块,使其匹配任何现有图形宪章,不仅通过自己的样式表,但也通过重写默认模板。
使用一个定制的样式表
因为生成的HTML是结构化内容,你可以做任何你喜欢的。
您可以定义另一个CSS用于一个管理模块,而不是一个通过添加一个默认css
发电机参数配置,如清单14-38所示。
清单14-38 -使用自定义样式表而不是默认的一个
发电机:类:sfPropelAdminGenerator参数:model_class:评论主题:默认css: mystylesheet
另外,您还可以使用提供的机制模块view.yml
覆盖的风格在阅览的基础上。
创建一个自定义页眉和页脚
的列表
和编辑
系统包括一个页眉和页脚部分的看法。没有部分的默认模板/
目录的管理模块,但你只需要添加一个与下列名称之一它包括自动:
_list_header。php _list_footer。php _edit_header。php _edit_footer。php
例如,如果您想添加一个自订标头文章/编辑
看来,创建一个文件_edit_header.php
如清单14-39所示。它将工作没有进一步配置。
清单14-39——示例编辑
头部分,模块/文章/模板/ _edit_header.php
< ? php如果(美元的文章- >getNbComments()>0):? >< h2 >这篇文章< ? php回声美元的文章- >getNbComments()? >评论。< / h2 >< ? phpendif;? >
注意,一个编辑部分总是访问当前对象通过一个变量命名的类,这一个列表
部分总是访问当前通过寻呼机美元寻呼机
变量。
侧边栏
使用自定义参数调用管理操作
管理模块操作可以接收使用自定义参数query_string
参数在一个link_to ()
帮手。例如,扩展前面的_edit_header
部分链接的评论文章,写这篇文章:
这篇文章< ? php回声link_to(美元的文章- >getNbComments()。“评论”,“评论/列表”,数组(“query_string”= >'过滤器=过滤器% 5 barticle_id % 5 d = '。美元的文章- >getId()))? >评论。
这个查询字符串参数的编码版本更清晰
'过滤器=过滤器(article_id) = '。$文章- > getId ()
它过滤评论只显示相关的美元的文章
。使用query_string参数,您可以指定一个排序顺序和/或一个过滤器来显示一个定制的列表视图。这也可以用于自定义交互。
自定义主题
还有其他的泛音继承了框架,可以覆盖的模块模板/
文件夹以匹配您的定制需求。
生成器模板是切成小部件,可以独立覆盖,和行动也可以改变一个接一个。
然而,如果你想覆盖的几个模块以同样的方式,您应该创建一个可重用的主题。一个主题是一套完整的模板和动作,可以使用一个管理模块如果在主题中指定的值generator.yml
。使用默认主题,symfony使用文件中定义ob娱乐下载$ sfob娱乐下载_symfony_data_dir /发电机/ sfPropelAdmin /违约/
。
主题文件必须位于项目树状结构,在一个数据/发电机/ sfPropelAdmin / [theme_name] /模板/
目录,你可以引导一个新的主题通过复制文件(位于从默认主题美元sfob娱乐下载_symfony_data_dir /发电机/ sfPropelAdmin / /模板/违约
目录)。这种方式,你确定所需的所有文件将出现在您的自定义主题主题:
/ /泛音,[theme_name] /模板/模板/ _edit_actions。php _edit_footer.php_edit_form.php_edit_header.php_edit_messages.php _filters.php _list.php _list_actions.php _list_footer.php _list_header.php _list_messages.php _list_td_actions.php _list_td_stacked.php _list_td_tabular.php _list_th_stacked.php _list_th_tabular.php // Actions, in [theme_name]/template/actions/actions.class.php processFilters() // Process the request filters addFiltersCriteria() // Adds a filter to the Criteria object processSort() addSortCriteria()
请注意模板文件实际上是模板的模板,即PHP文件将由一种特殊的实用程序来生成模板解析基于发电机设置(这被称为编译阶段)。生成的模板还必须包含PHP代码执行期间实际浏览,所以模板的模板使用另一种语法将PHP代码未实行的第一。清单14-40显示了提取模板的默认模板。
清单14-40 -模板的模板的语法
< ? phpforeach(这个美元- >getPrimaryKey()作为美元pk):? >(php吗?回声object_input_hidden_tag($ < ? php回声这个美元- >getSingularName()? >,“你能把< ?php echo $ pk - > getPhpName () ? > ')吗?]< ? phpendforeach;? >
在这个清单中,PHP代码引入的< ?
立即执行(编译),引入了吗(?
只有在执行执行,但模板引擎终于改变了吗(?
标记为< ?
标签,这样生成的模板是这样的:
< ? php回声object_input_hidden_tag(美元的文章,“getId”)? >
处理模板的模板是困难的,所以最好的建议如果你想创建自己的主题是开始的默认的
主题,逐步修改和测试它广泛。
提示
你也可以包一个发电机主题插件,这使得它更可重用和易于部署到多个应用程序。更多信息请参考第17章。
侧边栏
建立你自己的发电机
脚手架管理发电机都使用一组symfony内部组件,自动生成的行动和模板的创建缓存,使用主题和模板的模板的解析。ob娱乐下载
这意味着symfony提供了所有ob娱乐下载的工具来构建自己的发电机,可以像现有的或者是完全不同的。生成一个模块的管理生成()
的方法sfGeneratorManager
类。例如,生成一个政府,symfony调用以下内部:ob娱乐下载
generator_manager美元=新sfGeneratorManager();元数据=generator_manager美元- >生成(“sfPropelAdminGenerator”,美元的参数);
如果你想建立自己的发电机,你应该看的API文档欧宝官网下载appsfGeneratorManager
和sfGenerator
类,并为例sfAdminGenerator
和sfCRUDGenerator
类。
总结
引导你的模块或自动生成的后端应用程序,是一个良好定义的模式和对象模型的基础。你可以修改脚手架的PHP代码,但administration-generated模块主要通过修改配置。
的generator.yml
文件的核心编程生成的后端。它允许完整的定制内容,功能,外观和感觉的列表
和编辑
的观点。可以管理字段标签、工具提示、过滤器、排序顺序,页面大小,输入类型,外交关系,自定义交互,直接在YAML和凭证,没有一行PHP代码。
如果政府发电机本身不支持你所需要的功能,部分字段和覆盖能力行动提供完整的可扩展性。此外,您可以重用你的适应政府发电机机制由于主题机制。
这项工作是GFDL许可执照。