草庐IT

php - Symfony - 将值从一种形式传递到另一种形式

coder 2024-04-17 原文

我已经阅读了有关 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/

有关php - Symfony - 将值从一种形式传递到另一种形式的更多相关文章

  1. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的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

  2. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  3. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用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”以实现该目的?如果我想通过传递一些

  4. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在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中能不能做到类似的简洁?我可以只

  5. ruby - 如何将 Puma::Configuration 传递给 Sinatra? - 2

    这是我的网络应用: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

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过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

  8. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

  9. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    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],

  10. ruby - 如何将 lambda 传递给 Hash.each? - 2

    如何将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

随机推荐