专家:嵌套形式——一个真正的实现
宣布在以前的文章syob娱乐下载mfony 1.2能够自动保存对象从深层嵌套形式。公告后我给了一个简单的例子,但也有一些人向我要一个真实的项目的例子。所以在这里。
这个项目
让我们来分类网站。网站由广告。每个广告和一些通用的描述信息(如标题、描述、…)和一些更具体的基于广告类型(如床的数量或建设一栋房子,或制作,模型,或一辆车的颜色)。
所以,由一个主要模型的模式demo_ad
表和一些类型表(demo_ad_type_house
和demo_ad_type_car
)主办的广告的详细信息:
#配置/模式。yml推动:demo_ad: id: ~标题:{类型:varchar(255),要求:真实}描述:{类型:用longvarchar,要求:真}价格:浮子式:{类型:varchar(255),要求:真实}demo_ad_type_house: id: ~ demo_ad_id:{类型:整数,foreignTable: demo_ad foreignReference: id、要求:真实}square_footage:{类型:整数,要求:真}nb_beds:{类型:整数,要求:真}nb_baths:{类型:整数,要求:真}:{类型:varchar(255),要求:真实}demo_ad_type_car: id: ~ demo_ad_id:{类型:整数,foreignTable: demo_ad foreignReference: id、要求:真实}:{类型:varchar(255),要求:真实}模型:{类型:varchar(255),要求:真实}:{类型:varchar(255),要求:真实}颜色:{类型:varchar(255),要求:真正的}
为了让它更真实,让我们添加一些初始数据:
#数据/夹具/广告。yml DemoAd: house_1:标题:农场描述:| 250英亩灌溉,几股水权,小溪,弹簧和一口井。价格:2225000类型:房子car_1:标题:本田雅高描述:|本田雅阁满载,电动窗,天窗,新的正时皮带,新的刹车,a / c, cd播放器。价格:6900类型:汽车DemoAdTypeHouse: house_1_desc: demo_ad_id: house_1 square_footage: 4500 nb_beds: 4 nb_baths: 3年:1910 DemoAdTypeCar: car_1_desc: demo_ad_id: car_1:本田模型:雅高的一年:2002颜色:绿色
项目初始化
如果你想跟随,创建一个新的symfony项目通常的方式:ob娱乐下载
mkdir分类cd分类美元$ symfony生成:项目分类ob娱乐下载
然后创建上述两个文件我们有(配置/ schema.yml
和数据/夹具/ ads.yml
),配置数据库,构建模型,和饲料数据库初始数据:
美元。/ob娱乐下载 symfony配置:数据库mysql:主机= localhost; dbname =分类”根mYsEcret美元mysqladmin -uroot -pmYsEcret创建分类。美元/ symfony推动:build-all-load
在这篇文章中,我们将创建应用程序的后端展示所有的力量新管理发电机与symfony 1.2绑定。ob娱乐下载
美元。/ob娱乐下载 symfony生成:应用——escaping-strategy =——csrf-secret =独特ecret1美元后端
然后创建后端模块列表、创建、编辑和删除的广告:
美元。/ob娱乐下载 symfony推动:generate-admin端DemoAd
的
推动:generate-admin
自动添加一条航线routing.yml
配置文件。
的广告
模块现在已经准备好被使用在这些截图所示:
项目定制
你可以看到为自己截图,它还没有完全完成。
的类型
列,这是作为一个字符串存储在数据库中,需要改变从输入文本框的选择框的形式。
而不是硬编码形式可能的类型,宣布他们的作为一个简单的属性DemoAdPeer
类,所以它可以被重用稍后在项目:
/ / lib /模型/ DemoAdPeer.php类DemoAdPeer扩展BaseDemoAdPeer{静态公共美元的类型=数组(“房子”= >“房子”,“汽车”= >“汽车”);}
现在很容易改变类型
小部件的DemoAdForm
从一个文本输入的选择:
/ / lib /形式/ DemoAdForm.class.php类DemoAdForm扩展BaseDemoAdForm{公共函数配置(){这个美元- >widgetSchema(“类型”]=新sfWidgetFormChoice(数组(“选择”= > DemoAdPeer::美元的类型));这个美元- >validatorSchema(“类型”]=新sfValidatorChoice(数组(“选择”= >中的(DemoAdPeer::美元的类型)));}}
在编辑一个广告时,我们想要编辑的主要信息,而且详细的。因此,我们需要嵌入特定的描述形式的主要形式。
由于没有数据库之间的关系广告
和类型
,我们需要创建一个定制的方法DemoAd
模型的DemoAdType *
对象:
/ / lib /模型/ DemoAd.php类DemoAd扩展BaseDemoAd{公共函数getTypeObject(){/ /如果没有定义类型,没有类型对象如果(!这个美元- >方法()){返回零;}/ /类的类型取决于广告类型美元的类=sprintf(“DemoAdType % s”,ucfirst(这个美元- >方法()));美元的对等=常数(美元的类。“::同行”);/ /得到当前的广告对象类型相关美元标准=新标准();美元标准- >添加(常数(美元的对等。“::DEMO_AD_ID”),这个美元- >getId());/ /如果没有的话,创建一个新的与此相关的广告如果(is_null(美元的类型=call_user_func(数组(美元的对等,“doSelectOne”),美元标准))){美元的类型=新美元的类();美元的类型- >setDemoAd(这个美元);}返回美元的类型;}}
好玩的部分。嵌入类型形成如果有一个主要的广告形式:
/ / lib /形式/ DemoAdForm.class.php类DemoAdForm扩展BaseDemoAdForm{公共函数配置(){这个美元- >widgetSchema(“类型”]=新sfWidgetFormChoice(数组(“选择”= > DemoAdPeer::美元的类型));这个美元- >validatorSchema(“类型”]=新sfValidatorChoice(数组(“选择”= >中的(DemoAdPeer::美元的类型)));/ /只嵌入如果有对象类型(编辑和创建)如果(这个美元- >getObject()- >方法()){这个美元- >embedForm(“desc”,这个美元- >getTypeForm());}}公共函数getTypeForm(){美元的类=sprintf(“DemoAdType % sForm”,ucfirst(这个美元- >对象- >方法()));返回新美元的类(这个美元- >对象- >getTypeObject());}}
如果你现在刷新浏览器,你会有一个例外,因为嵌入式有选择框选择广告形式有关。渲染这个选择框,symfony需要的文本表示ob娱乐下载广告
:
类DemoAd扩展BaseDemoAd{公共函数__toString(){返回这个美元- >getTitle();}/ /……}
我们不希望人们能够改变广告之间的联系和类型,我们需要禁用相应的部件形式类型的类:
/ / lib /形式/ DemoAdTypeCarForm.class.php类DemoAdTypeCarForm扩展BaseDemoAdTypeCarForm{公共函数配置(){设置(这个美元(“demo_ad_id”]);}}/ / lib /形式/ DemoAdTypeHouseForm.class.php类DemoAdTypeHouseForm扩展BaseDemoAdTypeHouseForm{公共函数配置(){设置(这个美元(“demo_ad_id”]);}}
这就是所有。你现在可以改变的主要广告列或特定的保存形式,symfony将保存回数据库的一切。ob娱乐下载这可能与管理发电机没有定制任何东西。它只是工作!
当然,你会发现一些边界情况,需要工作,但是希望你现在能够进一步定制它。
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
首先,我有点困惑与新形式系统,但现在我开始觉得很好吃。
你已经有一个约会在接下来的β/释放condidate吗?
何,我觉得我找到了一个小错误:
(同行=常数美元类。“::对等”);
这也许应该是$同行=常数(类美元。“对等”);
不应该
如果(is_null (desc美元= call_user_func(数组($同行,“doSelectOne”),美元标准)))
实际上是
如果(is_null ($ type = call_user_func(数组($同行,“doSelectOne”),美元标准)))
如果(is_null (desc美元= call_user_func(数组($同行,“doSelectOne”),美元标准)))
应该是:
如果(is_null ($ type = call_user_func(数组($同行,“doSelectOne”),美元标准)))
现在,我有一些选举
推动或学说,对吧?这是不可能的工作与…
你的样品总是使用推动……但现在原则是第一个建议,对吧?
在未来,symfony和教义更ob娱乐下载好地工作吗?
现在,我不能让这个选择……
我不要什么usr生成模式
的例子是一个人有很多地址。
最高形式的用户,第二种形式的地址。我怎么能嵌入4地址表单前用户表单?我有很多问题到目前为止。我可以让它显示但验证似乎并不工作。
谢谢。
不喜欢:
但就像:
…
当我创建新形式被嵌入的字段保存,但是当我试着改变,模型. .领域还未得救。
用它wotks好吗?
恭喜。
这将是特别有用,知道如何处理与javascript添加或删除子元素形式。
干杯!
我也期待看到动态添加/移除子元素的另一个例子。
订阅这个博客提要足以获得通知呢?
请,给一些反馈。