我正在制作广告页面。广告可以是不同的类型,因此具有不同的数据。例如,车辆会将 make 和 model 作为额外数据。
现在,我有一个基本原则实体 Advert,其中包含每个广告所需的数据。不同的广告依次继承这个数据(doctrine2 discriminatormap)
如果用户选择创建汽车广告,我需要动态填充表单(使用 ajax 和 symfony2 表单)我想显示汽车广告的选项。但我还需要将实体更改为 AdvertVehicle 形式。
这可能吗?我确实阅读了 symfony2 主页上的食谱条目
"How to Dynamically Modify Forms Using Form Events": This should be handled by making an AJAX call back to your application. In that controller, you can submit your form, but instead of processing it, simply use the submitted form to render the updated fields. The response from the AJAX call can then be used to update the view.
我了解如何将 ajax 回调回我的 Controller ,我了解如何使用表单事件,但我如何获得呈现的选择框(例如包含车辆模型)的响应?使用新的 AbstractType?或表单生成器?
然后,当用户实际提交表单时,我需要使用所选广告类型的实体。我可以根据用户在表单中的选择动态更改实体吗?
编辑
我检查了表单继承,这很好,谢谢。我扩展了 AdvertType 并覆盖了 buildForm() 方法,在我为 AdvertVehicleType 添加我需要的项目之前,我调用了父方法。
进一步解释
每个广告实体都包含price、description、title 和category。一些广告包含更多,例如make 和model。它们由 discriminatormap (doctrine2)
示例:
// -- Entity
class CarAdvert extends Advert {
protected $model;
protected $make;
}
// -- Entity
// -- This uses discriminator mapping
class Advert {
protected $title;
protected $description;
protected $price;
protected $category;
}
如果用户选择类别 cars 我想使用 CarAdvert 实体(用于验证和持久化) 如果用户选择我只想使用的 house hold itemcategory普通的 Advert 实体。
一个主要问题仍然是我不知道如何通过ajax 呈现扩展表单。这部分有什么提示吗?当用户选择汽车作为类别时,我希望更新表单(通过 jQuery/ajax)但是我如何制作一个 Controller 来检索表单的扩展部分并将 html 作为响应发回(不使用 twig并将其呈现在 View 中,这可能吗)?
解决方案:
请参阅下面的答案!
最佳答案
解决方案:
我的问题的解决方案是在 Controller 中创建一些额外的函数来解决我希望能够根据用户的选择“即时”更改实体和表单的问题。
public function indexAction(Request $request)
{
$form = $this->getForm($request);
$form->handleRequest($request);
return array(
'form' => $form->createView(),
'request' => $request->request,
);
}
其中 getForm 检索表单(例如,用于车辆的 AdvertVehicleType 或用于“默认”广告的 AdvertType)。
getForm 方法如下所示:
private function getForm(Request $request)
{
$categoryTitle = 'NONE';
$categoryId = $request->request->get('advert', false)['category'];
if ($categoryId) {
$categoryTitle = $this->getDoctrine()->getRepository('Bundle:Category')->find($categoryId)->getTitle();
}
return $this->createForm($this->getFormType($categoryTitle), $this->getEntity($categoryTitle));
在这里,我检索了 categoryID(在请求的表单中选择的)并使用 getFormType 检索了 formType,并使用 getEntity 检索了实体。
private function getEntity($categoryTitle)
{
$entity = new Advert();
switch ($categoryTitle) {
case Category::CARS:
$entity = new AdvertCar();
}
return $entity;
}
private function getFormType($categoryTitle)
{
switch ($categoryTitle) {
case Category::CARS:
return new AdvertCarType();
default:
return new AdvertType();
}
}
为了能够使用 ajax 更新这个“动态”(但如果用户尝试提交表单它也可以工作)我在 Controller 中创建了另一个 Action 。
此操作呈现我想要更新的表单部分(在 ajax 调用上),我通过使用 twig 将表单对象设置为呈现的形式实际挑选出我不需要的内容来实现此目的:
{% do form.title.setRendered %}
(这只是一个例子,我实际上对所有我不想呈现的表单对象都这样做了。
然后我只需调用:
{{ form_rest(form) }}
这将检索表单的“其余部分”,这对于不同的类别是不同的。
现在假设您要选择州和城镇。首先选择州,然后在 Twig 中渲染该州的城镇(但实际上你可以只渲染你需要的部分,例如 {{ form_row(form.towns) }} 然后你返回这个渲染模板作为 json 响应,只需使用 jquery 将其放入您想要的 div 中即可。
$html = $this->renderView('@Bundle/NewAddPage/filter_area.twig', array('form' => $form->createView()));
然后在响应中返回 $html 变量。
我希望这会有所帮助,并且解释足够好,如果不只是发表评论,我会用我的答案更新它!
关于php - 动态表单(切换实体)symfony2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19628884/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210
我有一个ruby程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:defmethod_missing(meth,*args,&block)name=meth.to_sclass我收到以下错误:`define_method':interningemptystring(ArgumentError)in'method_missing'有什么想法吗?谢谢。编辑:我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:defmethod_missing(meth,*args,&block)Adder.class_evaldodefine_method