第十天:形式
前一天的Jobeet教程有良好的开端symfony测试框架的引入。ob娱乐下载今天我们将继续与形式框架。
表单框架
任何网站形式;从简单的接触形式复杂的很多领域。写作形式也是最复杂和繁琐的任务对web开发人员:您需要编写HTML表单,实现为每个字段验证规则,过程的值存储在一个数据库,显示错误消息,重新填充字段的错误,和更多…
当然,不是一次又一次地重新发明轮子,symfony提供了一个框架来缓解形式管理。ob娱乐下载表单框架由三部分组成:
验证验证:验证sub-framework提供类输入(整数、字符串、电子邮件地址、…)
小部件:小部件sub-framework提供类输出HTML字段(输入、文本区域、选择、…)
形式:表单类表示形式由小部件和验证器,并提供方法来帮助管理表单。每个表单字段都有自己的验证器和小部件。
形式
syob娱乐下载mfony的形式是一个类的字段。每个领域都有一个名字,一个验证器,一个小部件。一个简单的ContactForm
可以用下面的类定义:
类ContactForm扩展sfForm{公共函数配置(){这个美元- >setWidgets(数组(“电子邮件”= >新sfWidgetFormInputText(),“消息”= >新sfWidgetFormTextarea(),));这个美元- >setValidators(数组(“电子邮件”= >新sfValidatorEmail(),“消息”= >新sfValidatorString(数组(“max_length”= >255年)),));}}
表单字段的配置配置()
方法,通过使用setValidators ()
和setWidgets ()
方法。
小部件和确认器类的名称十分明确:电子邮件
领域将呈现为HTML<输入>
标记(sfWidgetFormInputText
)和验证电子邮件地址(sfValidatorEmail
)。的消息
字段将显示为一个textarea > <
标记(sfWidgetFormTextarea
),并且必须不超过255个字符的字符串(sfValidatorString
)。
默认情况下所有字段是必需的,作为默认值要求
选择是真正的
。因此,验证定义电子邮件
相当于新sfValidatorEmail(数组(“需要”= > true))
。
提示
你可以合并在另一个通过使用一种形式mergeForm ()
方法,或嵌入一个通过使用embedForm ()
方法:
这个美元- >mergeForm(新AnotherForm());这个美元- >embedForm(“名字”,新AnotherForm());
驱动形式
大多数时候,表单必须序列化到数据库。因为sob娱乐下载ymfony已经知道一切关于你的数据库模型,基于这些信息可以自动生成形式。事实上,当你启动了推动:构建——所有
任务在第三天,symfony会自动叫ob娱乐下载推动:构建——形式
任务:
php syob娱乐下载mfony推动美元:构建——形式
的推动:构建——形式
任务生成类的形式lib /形式/
目录中。这些生成的文件的组织是相似的lib /模型/
。每个模型类(例如类都有一个相关的形式JobeetJob
有JobeetJobForm
),默认是空的,因为它继承自基类:
/ / lib /形式/ JobeetJobForm.class.php类JobeetJobForm扩展BaseJobeetJobForm{公共函数配置(){}}
提示
通过浏览下生成的文件/ lib /形式/基地
子目录中,您将看到很多symfony内置部件和验证器的用法示例。ob娱乐下载
提示
你可以禁用表单生成特定模型通过传递参数ob娱乐下载
推动行为:
类:SomeModel: propel_behaviors: symfonyob娱乐下载:形式:假过滤器:假
定制的工作形式
工作学习形式定制表单是一个很好的例子。让我们看看如何定制它,一步一步。
首先,改变“后工作”链接布局能够检查变化直接在你的浏览器:
< !- - - - - -- - - - - -apps/frontend/templates/layout.php --> “< ?php echo url_for (job_new) ? > "< / > >职位工作
默认情况下,推动表单显示字段的表列。但对于工作形式,其中一些最终用户不能编辑。删除从一个表单字段一样简单的复位:
/ / lib /形式/ JobeetJobForm.class.php类JobeetJobForm扩展BaseJobeetJobForm{公共函数配置(){设置(这个美元(“created_at”],这个美元(“updated_at”],这个美元(“expires_at”],这个美元(“is_activated”]);}}
取消一个字段意味着领域小部件和验证器都删除。
而不是取消你不想显示的字段,也可以显式地列出你希望通过使用的字段useFields ()
方法:
/ / lib /形式/ JobeetJobForm.class.php类JobeetJobForm扩展BaseJobeetJobForm{公共函数配置(){这个美元- >useFields(数组(category_id添加的,“类型”,“公司”,“标志”,“url”,“位置”,“位置”,“描述”,“how_to_apply”,“令牌”,“is_public”,“电子邮件”));}}
的useFields ()
为您自动方法做两件事:添加隐藏字段和字段的数组是用来改变字段的顺序。
提示
显式列出你想要的表单字段显示意味着当添加新字段基本形式,他们不会自动出现在表单(认为模型的形式,你添加一个新的列相关表)。
表单配置有时必须更精确的比可以从数据库模式进行自检。例如,电子邮件
列是varchar
模式中,但是我们需要验证这一列作为一个电子邮件。让我们改变默认值sfValidatorString
到一个sfValidatorEmail
:
/ / lib /形式/ JobeetJobForm.class.php公共函数配置(){/ /……这个美元- >validatorSchema(“电子邮件”]=新sfValidatorEmail();}
替换默认的验证器并不总是最好的解决方案,作为默认验证规则从数据库中进行自检模式丢失(新sfValidatorString(数组(“max_length”= > 255))
)。最好几乎总是将新确认器添加到现有的使用特别的sfValidatorAnd
验证器:
/ / lib /形式/ JobeetJobForm.class.php公共函数配置(){/ /……这个美元- >validatorSchema(“电子邮件”]=新sfValidatorAnd(数组(这个美元- >validatorSchema(“电子邮件”],新sfValidatorEmail(),));}
的sfValidatorAnd
验证器需要一个数组的验证器,必须通过有效的价值。诀窍是参考当前验证器($ this - > validatorSchema(“电子邮件”)
),并添加新的。
请注意
您还可以使用sfValidatorOr
验证器力值通过至少一个验证器。当然,你可以混合和匹配sfValidatorAnd
和sfValidatorOr
验证器来创建复杂的基于布尔的验证器。
即使类型
列也是一个varchar
的模式,我们希望它的值被限制在一个列表的选择:全职,兼职,或者自由职业者。
首先,让我们定义的可能值JobeetJobPeer
:
/ / lib /模型/ JobeetJobPeer.php类JobeetJobPeer扩展BaseJobeetJobPeer{静态公共美元的类型=数组(“全职”= >“全职”,“兼职”= >“兼职”,“自由”= >“自由”,);/ /……}
然后,用sfWidgetFormChoice
为类型
部件:
这个美元- >widgetSchema(“类型”]=新sfWidgetFormChoice(数组(“选择”= > JobeetJobPeer::美元的类型,“扩展”= >真正的,));
sfWidgetFormChoice
代表一种选择小部件可以呈现由不同部件根据一些配置选项(扩大
和多个
):
- 下拉列表(
<选择>
):阵列(“多个”= >假,“扩大”= > false)
- 下拉框(
<选择多个=“多个”>
):阵列(“多个”= > true,“扩大”= > false)
- 单选按钮列表:
阵列(“多个”= >假,“扩大”= > true)
- 复选框列表:
阵列(“多个”= > true,“扩大”= > true)
请注意
如果你想要一个单选按钮被选中默认情况下(全职
),您可以更改默认值的数据库模式。
即使你认为没人可以提交一个无效的值,黑客可以很容易地使用工具如绕过小部件的选择旋度或者是Firefox Web开发人员工具栏。让我们改变验证器来限制可能的选择:
这个美元- >validatorSchema(“类型”]=新sfValidatorChoice(数组(“选择”= >中的(JobeetJobPeer::美元的类型),));
随着标志
列将存储的文件名与工作相关的标志,我们需要改变小部件到一个文件中输入标记:
这个美元- >widgetSchema(“标志”]=新sfWidgetFormInputFile(数组(“标签”= >公司标志的,));
对于每个领域,symfony会自ob娱乐下载动生成一个标签(这将用于呈现<标识>
标签)。这可以改变标签
选择。
你也可以改变标签在一个批处理setLabels ()
小部件数组的方法:
这个美元- >widgetSchema- >setLabels(数组(category_id添加的= >“类别”,“is_public”= >“公开?”,“how_to_apply”= >“如何应用?”,));
我们还需要改变默认的验证器:
这个美元- >validatorSchema(“标志”]=新sfValidatorFile(数组(“要求”= >假,“路径”= > sfConfig::得到(“sf_upload_dir”)。' /乔布斯,“mime_types”= >“web_images”,));
sfValidatorFile
很有趣的是很多东西:
- 验证上传的文件是一个图像在web格式(
mime_types
)李< / ><李>重命名文件的一些独特的东西李< / ><李>在给定的存储文件路径
- 更新
标志
列生成的名称李< / >
请注意
您需要创建标识目录(web /上传/工作/
),检查,它是由web服务器可写的。
验证器只保存在数据库中,文件名更改路径中使用showSuccess
模板:
/ /应用程序/前端/模块/工作/模板/ showSuccess.php< img src =“/上传/工作/ < ?php echo $工作- > getLogo () ? > "alt =“< ?php echo $工作- > getCompany() ? >标志”/ >
提示
如果一个generateLogoFilename ()
方法在模型中存在,它将被称为验证器和结果将覆盖默认的生成标志
文件名。该方法采用sfValidatedFile
对象作为参数。
正如您可以覆盖任何领域的生成标签,您还可以定义一个帮助信息。让我们添加一个is_public
列,以更好地解释它的意义:
这个美元- >widgetSchema- >setHelp(“is_public”,的工作是否也可以在联盟网站上发表。”);
最后一个JobeetJobForm
类读取如下:
/ / lib /形式/ JobeetJobForm.class.php类JobeetJobForm扩展BaseJobeetJobForm{公共函数配置(){设置(这个美元(“created_at”],这个美元(“updated_at”],这个美元(“expires_at”],这个美元(“is_activated”]);这个美元- >validatorSchema(“电子邮件”]=新sfValidatorAnd(数组(这个美元- >validatorSchema(“电子邮件”],新sfValidatorEmail(),));这个美元- >widgetSchema(“类型”]=新sfWidgetFormChoice(数组(“选择”= > JobeetJobPeer::美元的类型,“扩展”= >真正的,));这个美元- >validatorSchema(“类型”]=新sfValidatorChoice(数组(“选择”= >中的(JobeetJobPeer::美元的类型),));这个美元- >widgetSchema(“标志”]=新sfWidgetFormInputFile(数组(“标签”= >公司标志的,));这个美元- >widgetSchema- >setLabels(数组(category_id添加的= >“类别”,“is_public”= >“公开?”,“how_to_apply”= >“如何应用?”,));这个美元- >validatorSchema(“标志”]=新sfValidatorFile(数组(“要求”= >假,“路径”= > sfConfig::得到(“sf_upload_dir”)。' /乔布斯,“mime_types”= >“web_images”,));这个美元- >widgetSchema- >setHelp(“is_public”,的工作是否也可以在联盟网站上发表。”);}}
表单模板
现在形式类已经被定制,我们需要显示它。模板的形式是相同的,无论你想创建一个新的工作或编辑现有的一个。事实上,这两个欧宝平台是合法的吗newSuccess.php
和editSuccess.php
模板非常相似:
< !- - - - - -- - - - - -apps/frontend/modules/job/templates/newSuccess.php -->< ? phpuse_stylesheet(“job.css”)吗?><标题>发布工作< / h1 >< ? phpinclude_partial(“形式”,数组(“形式”= >美元的形式))吗?>
请注意
如果你没有添加工作
样式表,是时候这样做在两个模板(< ? phpuse_stylesheet(“job.css”)? >
)。
在呈现形式本身_form
部分。替换的内容生成_form
部分与下面的代码:
< !- - - - - -- - - - - -apps/frontend/modules/job/templates/_form.php -->< ? phpuse_stylesheets_for_form(美元的形式)吗?>< ? phpuse_javascripts_for_form(美元的形式)吗?>< ? php回声form_tag_for(美元的形式,“@job”)吗?><表id =“job_form”> < tfoot > < tr > < td colspan =“2”> < input type =“提交”值=“预览你的工作”/ > < / td > < / tr > < / tfoot > < tbody >< ? php回声美元的形式吗?>< / tbody > < /表> > < /形式
的use_javascripts_for_form ()
和use_stylesheets_for_form ()
助手包括JavaScript和样式表表单组件所需的依赖项。
提示
即使工作表单不需要任何JavaScript或样式表文件,它是一个好习惯保持这些助手调用“以防”。它可以节省你天之后如果你决定改变一个小部件,需要一些JavaScript或特定的样式表。
的form_tag_for ()
辅助生成一个<形式>
标记为给定的形式和HTTP方法路线和变化帖子
或把
取决于对象是新的。它还负责多部分
如果表格有任何文件输入标签属性。
最终,< ? phpecho $形式? >
呈现小部件。
侧边栏
自定义表单的外观和感觉
默认情况下,< ? phpecho $形式? >
呈现表单组件表行。
在大多数情况下,您将需要定制表单的布局。这个定制的表单对象提供了许多有用的方法:
方法 | 描述 |
---|---|
呈现() |
呈现形式(相当于的输出 |
echo $形式 ) |
|
renderHiddenFields () |
呈现隐藏字段 |
hasErrors () |
返回真正的 如果表单有一些错误 |
hasGlobalErrors () |
返回真正的 如果表单有全球错误 |
getGlobalErrors () |
返回一个数组的全球错误 |
renderGlobalErrors () |
使全球的错误 |
形式也像字段的数组。您可以访问公司
字段美元形式(“公司”)
。返回的对象提供了方法来呈现每个元素的领域:
方法 | 描述 |
---|---|
renderRow () |
显示字段行 |
呈现() |
领域呈现小部件 |
renderLabel () |
呈现字段标签 |
renderError () |
如果任何领域呈现错误消息 |
renderHelp () |
显示帮助信息 |
的echo $形式
声明相当于:
< ? phpforeach(美元的形式作为美元的小部件):吗?>< ? php回声美元的小部件- >renderRow()吗?>< ? phpendforeach吗?>
表单动作
我们现在有一个类和一个模板形式,呈现它。现在,是时候让它使用一些行动。
工作形式是由五个方法工作
模块:
- 新:显示一个空白表格来创建一个新工作李< / ><李>编辑:显示一个表单来编辑现有的工作李< / ><李>创建:创建一个新的工作与用户提交的值李< / ><李>更新:更新现有的工作与用户提交的值李< / ><李>processForm:被
创建
和更新
,它处理表单(验证、形式重新和序列化到数据库)李< / >
所有形式的生命周期:
我们已经创建了一个推动路线提前5天的集合工作
模块,我们可以简化形式的代码管理方法:
/ /应用程序/前端/模块/工作/行动/ actions.class.php公共函数executeNew(sfWebRequest美元的请求){这个美元- >形式=新JobeetJobForm();}公共函数executeCreate(sfWebRequest美元的请求){这个美元- >形式=新JobeetJobForm();这个美元- >processForm(美元的请求,这个美元- >形式);这个美元- >setTemplate(“新”);}公共函数executeEdit(sfWebRequest美元的请求){这个美元- >形式=新JobeetJobForm(这个美元- >getRoute()- >getObject());}公共函数executeUpdate(sfWebRequest美元的请求){这个美元- >形式=新JobeetJobForm(这个美元- >getRoute()- >getObject());这个美元- >processForm(美元的请求,这个美元- >形式);这个美元- >setTemplate(“编辑”);}公共函数executeDelete(sfWebRequest美元的请求){美元的请求- >checkCSRFProtection();美元的工作=这个美元- >getRoute()- >getObject();美元的工作- >删除();这个美元- >重定向(“工作/指数”);}受保护的函数processForm(sfWebRequest美元的请求,sfForm美元的形式){美元的形式- >绑定(美元的请求- >getParameter(美元的形式- >getName()),美元的请求- >getfile(美元的形式- >getName()));如果(美元的形式- >isValid()){美元的工作=美元的形式- >保存();这个美元- >重定向(“job_show”,美元的工作);}}
当你浏览到/工作/新
页面,创建一个新的表单实例并传递给模板(新
行动)。
当用户提交表单(创建
在表单绑定(行动),bind ()
方法)与用户提交的价值观和触发验证。
一旦表单绑定,可以检查其有效性使用isValid ()
方法:如果是有效的(返回真正的
),工作是保存到数据库(形式- > save ()
),用户被重定向到工作预览页面;如果没有,欧宝平台是合法的吗newSuccess.php
模板显示与用户再次提交值和相关的错误消息。
提示
的setTemplate ()
方法改变模板用于给定的行动。如果提交的表单是无效的,创建
和更新
方法使用相同的模板新
和编辑
行动分别在内部将形式和错误消息。
修改现有的工作非常相似。唯一的区别新
和编辑
行动是被修改的工作对象是作为第一个参数传递的形式的构造函数。这个对象将用于模板中默认widget值(默认值是一个对象驱动形式,但一个普通阵列对于简单的形式)。
您还可以定义默认值创建表单。一种方法是声明数据库模式中的值。另一个是通过pre-modified工作
表单对象的构造函数。
改变executeNew ()
方法定义全职
作为默认值类型
专栏:
/ /应用程序/前端/模块/工作/行动/ actions.class.php公共函数executeNew(sfWebRequest美元的请求){美元的工作=新JobeetJob();美元的工作- >setType(“全职”);这个美元- >形式=新JobeetJobForm(美元的工作);}
请注意
表单绑定时,默认值是用户提交的所取代。用户提交的值将用于表单时重新被显示验证错误。
保护工作与表达形式
一切都必须工作好了。到目前为止,用户必须输入的令牌的工作。但是工作令牌必须自动生成创建一份新工作时,当我们不想依靠用户提供一个惟一的令牌。
更新save ()
的方法JobeetJob
添加逻辑生成令牌之前保存一份新工作:
/ / lib /模型/ JobeetJob.php公共函数保存(PropelPDO反对美元=零){/ /……如果(!这个美元- >getToken()){这个美元- >setToken(sha1(这个美元- >getEmail()。兰德(11111年,99999年)));}返回父::保存(反对美元);}
现在可以移除令牌
从表单字段:
/ / lib /形式/ JobeetJobForm.class.php类JobeetJobForm扩展BaseJobeetJobForm{公共函数配置(){设置(这个美元(“created_at”],这个美元(“updated_at”],这个美元(“expires_at”],这个美元(“is_activated”],这个美元(“令牌”]);/ /……}/ /……}
如果你还记得第二天的用户故事,一份工作可以只有用户知道编辑相关的令牌。现在,它很容易编辑或删除任何工作,通过猜谜的URL。这是因为编辑URL/ /编辑工作/ ID
,在那里ID
的主键的工作。
默认情况下,sfPropelRouteCollection
路线与主键生成url,但它可以改变任何通过独特的列列
选择:
#应用/前端/ config / ~路由|路由~。yml工作:类:sfPropelRouteCollection选项:{模型:JobeetJob列:令牌}要求:{令牌:\ w +}
请注意,我们也改变了令牌
参数要求匹配任何字符串symfony默认需求ob娱乐下载\ d +
唯一键。
现在,所有航线相关工作,除了job_show_user
1、嵌入标记。例如,编辑工作的路线现在以下模式:
http://www.jobeet.com.localhost/job/TOKEN/edit
你还需要改变的“编辑”链接showSuccess
模板:
< !- - - - - -- - - - - -apps/frontend/modules/job/templates/showSuccess.php --> “< ?php echo url_for (job_edit,工作)美元? > ">编辑< / >
预览页面
预览页面显示页面是一样的工作。由于路由,如果用户有正确的标记,这将是可访问的令牌
请求参数。
如果用户的标记化的URL,我们将添加一个管理员栏在顶部。刚开始的时候showSuccess
模板,添加一个部分主机管理酒吧和删除编辑
底部的链接:
< !- - - - - -- - - - - -apps/frontend/modules/job/templates/showSuccess.php -->< ? php如果(sf_request美元- >getParameter(“令牌”)= =美元的工作- >getToken()):吗?>< ? phpinclude_partial(“工作/管理”,数组(“工作”= >美元的工作))吗?>< ? phpendif吗?>
然后,创建一个_admin
部分:
< !- - - - - -- - - - - -apps/frontend/modules/job/templates/_admin.php -->“job_actions”> < h3 >管理< / h3 > < ul >< ? php如果(!美元的工作- >getIsActivated()):吗?><李> < ? php回声link_to(“编辑”,“job_edit”,美元的工作)李李? > < / > < > < ? php回声link_to(“发布”,“job_edit”,美元的工作)李? > < / >< ? phpendif吗?><李> < ? php回声link_to(“删除”,“job_delete”,美元的工作,数组(“方法”= >“删除”,“确认”= >“你确定吗?”))李? > < / >< ? php如果(美元的工作- >getIsActivated()):吗?>< < ? php美元的工作- >expiresSoon()和打印”class =“expires_soon”> > ?< ? php如果(美元的工作- >isExpired()):吗?>过期的< ? php其他的:吗?>在<强> < ? php到期回声美元的工作- >getDaysBeforeExpires()? > < /强>天< ? phpendif吗?>< ? php如果(美元的工作- >expiresSoon()):吗?>——< a href =”“>扩展< / >为另一个< ? php回声sfConfig::得到(“app_active_days”)吗?>天< ? phpendif吗?>李< / >< ? php其他的:吗?><李>(书签这< ? php回声link_to(“URL”,“job_show”,美元的工作,真正的)吗?>管理这个工作在未来。]李< / >< ? phpendif吗?>< / ul > < / div >有很多代码,但是大部分的代码容易理解。
使模板更具可读性,我们增加了很多的快捷方法
JobeetJob
类:/ / lib /模型/ JobeetJob.php公共函数getTypeName(){返回这个美元- >方法()吗?JobeetJobPeer::美元的类型(这个美元- >方法()]:”;}公共函数isExpired(){返回这个美元- >getDaysBeforeExpires()<0;}公共函数expiresSoon(){返回这个美元- >getDaysBeforeExpires()<5;}公共函数getDaysBeforeExpires(){返回装天花板((这个美元- >getExpiresAt(“U”)- - - - - -时间())/86400年);}管理栏显示不同的动作根据工作状态:
请注意
你将能够看到“激活”栏下一节。
激活和出版工作
在前一节中,有一个链接到发布工作。需要更改链接指向一个新的
发布
行动。而不是创建一个新的路线,我们可以配置现有的工作
路线:#应用/前端/ config /路由。yml工作:类:sfPropelRouteCollection选项:模型:JobeetJob专栏:令牌object_actions:{发布:把}要求:令牌:\ w +的
object_actions
需要额外的行动为给定对象的数组。我们现在可以改变“发布”链接的链接:< !- - - - - -- - - - - -apps/frontend/modules/job/templates/_admin.php -->< ? php回声link_to(“发布”,“job_publish”,美元的工作,数组(“方法”= >“把”))吗?>李< / > 最后一步是创建
发布
行动:/ /应用程序/前端/模块/工作/行动/ actions.class.php公共函数executePublish(sfWebRequest美元的请求){美元的请求- >checkCSRFProtection();美元的工作=这个美元- >getRoute()- >getObject();美元的工作- >发布();这个美元- >getUser()- >setFlash(“通知”,sprintf(现在你的工作是网络% s天。”,sfConfig::得到(“app_active_days”)));这个美元- >重定向(“job_show_user”,美元的工作);}精明的读者会注意到“发布”链接提交HTTP put方法。模拟方法,该链接将自动转换为一种当你点击它。
因为我们有启用CSRF保护,
link_to ()
帮助链接和嵌入CSRF令牌checkCSRFProtection ()
请求对象的方法检查的有效性在提交。的
executePublish ()
方法使用一个新的发布()
方法可以定义如下:/ / lib /模型/ JobeetJob.php公共函数发布(){这个美元- >setIsActivated(真正的);这个美元- >保存();}您现在可以在您的浏览器中测试新发布的功能。
但是我们仍然有修复。非活性的工作不能访问,这意味着他们不能出现在Jobeet主页,和不能访问的URL。我们已经创建了一个
addActiveJobsCriteria ()
方法来限制标准
积极的工作,我们可以编辑和添加新需求结束时:/ / lib /模型/ JobeetJobPeer.php静态公共函数addActiveJobsCriteria(标准美元标准=零){/ /……美元标准- >添加(自我::IS_ACTIVATED,真正的);返回美元标准;}这是所有。你现在可以测试它在您的浏览器中。所有非活性的工作从主页已经消失了;即使你知道他们的网址,他们无法访问了。然而,如果人知道工作的令牌访问URL。在这种情况下,工作与管理栏预览会出现。
这是一个伟大的MVC模式的优点和refactorization我们所做的。只有一个变化在一个方法需要添加新的需求。
请注意
当我们创建了
getWithJobs ()
方法,我们忘了使用addActiveJobsCriteria ()
方法。所以,我们需要编辑它并添加新的要求:类JobeetCategoryPeer扩展BaseJobeetCategoryPeer{静态公共函数getWithJobs(){/ /……美元标准- >添加(JobeetJobPeer::IS_ACTIVATED,真正的);返回自我::doSelect(美元标准);}最终的想法
今天挤满了很多新的信息,但是希望你现在有一个更好的理解symfony框架的形式。ob娱乐下载
我们知道你们中的一些人注意到,我们忘记了一些东西…我们没有执行任何测试新特性。因为编写测试是开发应用程序的一个重要组成部分,这是明天我们将做的第一件事。
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。