我已经阅读了有关 Symfony 表单和 Twig 的所有内容,但还没有找到解决我的问题的方法,所以我决定问问你们。
我想要实现的是只将重复数据传递到我的注册表单一次。我想保存在数据库中的数据是用户详细信息、公司名称和地址以及分公司名称和地址。我需要将地址详细信息复制到两个实体,即公司和分公司。<>
有没有一种方法可以仅将此数据传递到 Web 界面中的表单一次,并将其指向要添加到实体并进行验证的两个 Symfony 表单。
我知道我可以在表单之外将地址数据从一个实体复制到另一个实体,但感觉不对。
主要注册表格类型:
class RegistrationFormType extends AbstractType
{
private $class;
public function __construct($class)
{
$this->class = $class;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('first_name')
->add('last_name')
->add('username')
->add('email', 'email')
->add('password', 'password')
->add('company', new CompanyType())
->add('branch', new BranchType())
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => $this->class,
'intention' => 'registration',
));
}
public function getName()
{
return 'registration';
}
}
公司类型:
class CompanyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('companyName')
->add('foo', new CompanyInfoType(), array('data_class' => 'Acme\UserBundle\Entity\Company'))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\Company',
'validation_groups' => array('Registration'),
));
}
public function getName()
{
return 'company';
}
}
分支类型:
class BranchType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('branchName')
->add('boo', new CompanyInfoType(), array('data_class' => 'Acme\UserBundle\Entity\Branch'))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\Branch',
'validation_groups' => array('Registration'),
));
}
public function getName()
{
return 'branch';
}
}
公司信息类型:
class CompanyInfoType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('streetNumber')
->add('address')
->add('city')
->add('zip')
->add('country')
->add('contactName')
->add('phone')
->add('email')
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'inherit_data' => true
));
}
public function getName()
{
return 'company_info';
}
}
谢谢!
//编辑
我只是想解释一下为什么我要将公司详细信息复制到分支机构,因为它看起来确实有点奇怪。
这样做只是因为我想准备好结构,以防客户想将他们的帐户升级到“企业”。通过默认注册,他们基本上只有一个分支机构,相当于公司总部,如果他们添加更多分支机构,公司详细信息保持不变,因为这是他们的主要“分支机构”。现有用户和其他内容已经映射到该分支,因此添加新分支不需要任何数据库或其他结构更改。
//编辑2 多亏了 linuxatico,我设法让这个在表单内部工作,但我相信它可以更漂亮地解决。这是我的做法:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('first_name')
->add('last_name')
->add('username')
->add('email', 'email')
->add('password', 'password')
->add('company', new CompanyType())
->add('branch', new BranchType())
;
$builder->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) {
$company = $event->getForm()->get('company')->getData();
$event->getForm()->get('branch')->getData()
->setBranchName($company->getCompanyName())
->setStreetNumber($company->getStreetNumber())
->setAddress($company->getAddress())
->setCity($company->getCity())
->setCountry($company->getCountry())
->setZip($company->getZip())
->setContactName($company->getContactName())
;
});
}
>
最佳答案
嗯,我不认为你在做什么是个好主意,根据你给我们的信息,你似乎在设计软件方面存在结构性问题,而且肯定有另一种更好的方法来解决你的问题.
无论如何,如果您想继续您的解决方案,我可以建议使用 AJAX,最好是 JQuery,这样如果第一个表单正确,您可以向第二个表单发出 POST 请求。
在伪代码中:
$.post({ url1,
key_value_array_data,
function(){
$.post({ url2,
key_value_array_data,
function(){
//custom_code
});
}
});
编辑:这肯定有帮助:https://api.jquery.com/serialize/
编辑 #2:您还可以使用 Symfony 的内部事件系统来拦截表单提交并根据需要自定义行为:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
关于php - Symfony - 将值从一种形式传递到另一种形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23423286/
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
这是我的网络应用:classFront我是这样开始的(请不要建议使用Rack):Front.start!这是我的Puma配置对象,我不知道如何传递给它:require'puma/configuration'Puma::Configuration.new({log_requests:true,debug:true})说真的,怎么样? 最佳答案 配置与您运行的方式紧密相关puma服务器。运行的标准方式puma-pumaCLI命令。为了配置puma配置文件config/puma.rb或config/puma/.rb应该提供(参见examp
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],
如何将lambda传递给hash.each,以便我可以重复使用一些代码?>h={a:'b'}>h.eachdo|key,value|end=>{:a=>"b"}>test=lambdado|key,value|puts"#{key}=#{value}"end>test.call('a','b')a=b>h.each&testArgumentError:wrongnumberofarguments(1for2)from(irb):1:in`blockinirb_binding'from(irb):5:in`each'from(irb):5from/Users/jstillwell/.rv