草庐IT

php - Symfony 中多个地址的一种形式 - Twig

coder 2024-04-19 原文

首先,我想澄清一下,我并没有(甚至)为我的表单使用 Entities/Doctrine。我正在使用网络服务来添加/编辑数据库的数据字段

我正在开展一个项目,我需要编辑具有多个地址的公司信息。 第一个地址始终是物理地址,因此我在与公司数据相同的循环中获取它。

然而,第二个(和第三个,或第四个,如果存在的话)地址被放置在一个单独的数据库条目中。 我可以用一种形式编辑公司数据和公司地址(物理地址)(因为数据都在一组中)因此我只需要一种形式,而不必使用循环地址。


现在我想编辑第二个地址。我正在遍历 twig 中的地址并打印出该公司的所有其他地址。 据我所知,Symfony 不允许相同形式的多个实例,因为这会干扰 ID 等。

问题是我应该如何只为特定地址呈现表单。我想通过单击按钮进行编辑(如果不编辑,则使用 bootstrap collapse 隐藏表单)

我的代码是这样的:

Controller :

public function editcompany(Request $request, $klantnr)
{

    [...]

    $result = [
        'gegevens' => [],
        'addresses' => [],
    ];

    foreach ($company as $row) {
        $dataFields = [
            [...] // The data fields of the company (including the physical address)
        ];
        foreach ($dataFields as $dataField) {
            if (empty($result['gegevens'][$dataField])) {
                $result['gegevens'][$dataField] = $row[$dataField];
            }
        }
        if($row['AdrGid'] != $result['gegevens']['AdrGid']) {
            $result['addresses'][$row['AdrGid']] = [
                [...] // The data fields for the other addresses 
            ];
        }
    }

    // The form creation of the company data form
    $form = $this->createForm(EditcompanyForm::class);

    // The form of the other addresses
    $form_adres = $this->createForm(EditcompanyAdresForm::class, array(
        [...]
    ));
    $form->handleRequest($request);
    $form_adres->handleRequest($request);


    if($form->isSubmitted() && $form->isValid()) {
        [...] // Handling the submitted data for the company data
    }

    // GEKOPPELDE ADRESSEN company
    if($form_adres->isSubmitted() && $form_adres->isValid()) {

        [...]

        $data = array(
            [...] // Setting the data for the other addresses
        );

        [...]

        // Passing the data and other options to the webservices
        $this->get('http')->companyRequest($data, $admincode, $service, $token);

        $request->getSession()
            ->getFlashBag()
            ->add('success', 'Linked address successfully edited');

        return $this->redirect($request->getUri());
    }

    return $this->render('pages/company/edit.html.twig', array(
        'client' => $result,
        'form_company' => $form->createView(),
        'form_company_adres' => $form_adres->createView()
    ));
 }

表单生成器(抽象类型):

class EditcompanyAdresForm extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $factuuradres = $options['NawFactuurAdres'];
        $lands = $options['lands'];

        $data = array();
        $builder
            [...] // Add the necessary fields
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            [...] // setting defaults here
        ));
    }
    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_form_editcompanyadresform';
    }
}

Twig 模板(显示地址:

{% for address in client.addresses %}
    <div class="right-cont-grey">
        [...] // showing addresses
    </div>
{% endfor %}

Twig模板(编辑形式):

{% for address in client.addresses %}
    {{ form_start(form_company_adres, {'  method': 'POST'}) }}
    {{ form_row(form_company_adres._token) }}
        <section class="collapse" id="adres_plus">
            <div id="adres" class="new-adres collapse right-cont-grey">
                <div class="col-sm-12">
                    [...] // Form_widgets with values from database
            </div>
        </section>
    {{ form_end(form_company_adres) }}
{% endfor %}

简而言之:

如何在不干扰的情况下为每个地址使用地址表?也许在循环内的 Twig 文件中创建 View (渲染)? 我的表单已预先填入数据库中的数据,因此我可以对其进行编辑。

最佳答案

修改了关于我们在聊天中讨论的内容的答案:

正如我在评论中所写,我确定您只需要设置一个 collection field .然后,整个复杂性基本上消失了

一个非常简单的例子是:

Controller :

public function editCompanyAction(Request $request)
{
    // get the data anyway you see fit and produce a model (this could also be a dedicated DTO)
    $company = $this->getInput();

    // create the form
    $form = $this
        ->createForm(CompanyWithAddressesType::class, $company)
        ->handleRequest($request)
    ;

    // handle submission
    if ($form->isSubmitted() && $form->isValid()) {
        dump($form->getData()); // === $company
    }

    return $this->render('default/index.html.twig', [
        'form' => $form->createView(),
    ]);
}

表格

这里的重要部分是您添加的字段的名称与作为数据提供的数组中的键匹配!

class CompanyWithAddressesType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // combine the company with a collection of addresses:
        $builder
            ->add('gegevens', CompanyType::class)
            ->add('addresses', CollectionType::class, [
                'entry_type' => AddressType::class,
            ])
        ;
    }
}

class CompanyType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // all the fields that are *extra* for companies, address fields are inherited
        // because this type extends the address type (see below getParent)
        $builder
            ->add('NawWebsite', TextType::class)
            ->add('email1', TextType::class)
            ->add('AdrNaam1', TextType::class)
        ;
    }

    /**
     * @return @inheritdoc
     */
    public function getParent()
    {
        return AddressType::class;
    }
}

class AddressType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // all the fields that define an address
        $builder
            ->add('AdrStraat', TextType::class)
            ->add('AdrHuisnummer', TextType::class)
            ->add('AdrPostcode', TextType::class)
            ->add('NawFactuurAdres', CheckboxType::class)
        ;
    }
}

Twig :

简单的输出表格。任何form customization适用

{{ form_start(form) }}
    <div>
        <h4>Company</h4>
        {{ form_row(form.gegevens.NawWebsite) }}
        {{ form_row(form.gegevens.email1) }}
        {{ form_row(form.gegevens.AdrNaam1) }}
    </div>

    <div>
        <h4>Main address</h4>
        {{ form_rest(form.gegevens) }}
    </div>

    <div>
        <h4>Extra addresses</h4>
        {% for address in form.addresses %}
            {{ form_errors(address) }}
            {{ form_widget(address) }}
        {% endfor %}
    </div>

    <button>Submit</button>
{{ form_end(form) }}

关于php - Symfony 中多个地址的一种形式 - Twig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47831184/

有关php - Symfony 中多个地址的一种形式 - Twig的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  5. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  6. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  7. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  8. 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|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  9. ruby-on-rails - before_filter 运行多个方法 - 2

    是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

随机推荐