gpt4 book ai didi

php - 无法访问具有键数组子集的数组中的表单值

转载 作者:搜寻专家 更新时间:2023-10-31 21:21:13 24 4
gpt4 key购买 nike

对于一个项目,我在一家公司工作,地址与该公司相关。我用它的实际地址为公司创建了一个表格(这个地址总是存在的,它还有与之关联的额外地址。这就是我遇到问题的地方。

我正在为表单使用 CollectionType,以便为每个额外地址使用相同的表单。我正在为额外地址(可以是 1、2、3 甚至 4 个地址)创建一个预填值的表单,使用:

    $form_adressen = $this
->createForm(AdressenType::class, $result['extra_address'])
->handleRequest($request)
;

然而,这不会呈现表单并且不会从 Controller 获取任何值。但是,以下代码有效:

    $form_adressen = $this
->createForm(AdressenType::class, $result)
->handleRequest($request)
;

结果['extra_address'] 打印以下数据:

Array
(
[1059] => Array
(
[AdrGid] => 1059
[AdrCode] => the address type
[AdrStraat] => streetname
[AdrHuisnummer] => number
[AdrPostcode] => postal code
[AdrPlaats] => cityname
[AdrTelefoon] => telephone
[AdrTelefoon2] => mobile
[AdrTelefax] => fax
[AdrNawGid] => 332 //id of companyaddress associating to this 'extra' address
[NawFactuurAdres] => 1
[AdrOms] => address type description
)
[...] // More addresses
}

$result 给我这个:

Array
(
[company] => Array
(
[AdrGid] => 332
[NawFilZoekcode] => company code
[AdrNaam1] => company name
[email2] => company mail
[NawWebsite] => company website
[email1] => second company email
[AdrStraat] => streetname
[AdrHuisnummer] => number
[AdrPostcode] => postal code
[AdrPlaats] => cityname
[LndOms] => country
[AdrTelefoon] => telephone
[AdrTelefoon2] => mobile
[AdrTelefax] => fax
[NawFactuurAdres] => 1
[AdrCode] => adrress type
[AdrOms] => address type description
)

[extra_address] => Array
(
[1059] => Array
(
[AdrGid] => 1059
[AdrCode] => address type
[AdrStraat] => streetname
[AdrHuisnummer] => number
[...] // etc etc

我的结果数组如下所示:

foreach ($company as $row) {
$dataFields = [
[...]
];
foreach ($dataFields as $dataField) {
if (empty($result['gegevens'][$dataField])) {
$result['company'][$dataField] = $row[$dataField];
}
}
if ($row['AdrGid'] != $result['gegevens']['AdrGid']) {
$result['extra_address'][$row['AdrGid']] = [
[...]
];
}
}

编辑:我的 AdressenType 用于创建表单:

class AdressenType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('addresses', CollectionType::class, [
'entry_type' => AddressType::class
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
));
}
public function getBlockPrefix()
{
return 'appbundle_form_adressenform';
}
}
class AddressType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
[...] // Add fields
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
));
}
}

这就是我将表单传递给 View 的方式:

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

如您所见,extra_address 循环使用一个 id 作为数组的键,我想这就是地址未显示或未在 View 中呈现的原因。

我使用以下代码遍历每个表单:

{{ form_start(form_adressen, {'  method': 'POST'}) }}
{{ form_row(form_adressen._token) }}
{% for adres in form_adressen.addresses %} // here 'addresses' is my form collectionType, not to be confusing
[...] // form_widgets, etc
{{ endfor }}
{{ form_end(form_adressen) }}

其中 form_adressen 是我的 formType 名称,'addresses' 是我的 form_adressen formType 的 collectionType。

我的问题是,如果每个地址都有一个 id 作为数组的键,我该如何用数据填充地址表?我的猜测是表单无法识别键,因此它会跳过。

最佳答案

当前 AdressenType 试图在 ['addresses'] 中找到它的数据,但在 Controller 中,您通过直接传入额外地址列表来创建表单。

->createForm(AdressenType::class, $result['extra_address'])

这个数组可能没有键 'addresses',因此表单就像不存在任何条目一样。

所以要么:

  1. 传入正确的数据:

    ->createForm(AdressenType::class, [
    'addresses' => $result['extra_address']
    ])
  2. AdressenType中的key改为'extra_address'并传入$result:

    $builder
    ->add('extra_address', CollectionType::class, [
    'entry_type' => AddressType::class
    ])
    ;

    ->createForm(AdressenType::class, $result)
  3. 或者更好,更改AdressenType 以直接扩展CollectionType。哪个(恕我直言)是更好/更干净的事情,因为它消除了对任意数组键的依赖:

    <?php
    // ...
    use Symfony\Component\Form\Extension\Core\Type\CollectionType;

    class AdressenType extends AbstractType
    {
    /**
    * @inheritdoc
    */
    public function configureOptions(OptionsResolver $resolver)
    {
    $resolver->setDefaults([
    'entry_type' => AddressType::class,
    ]);
    }

    /**
    * @inheritdoc
    */
    public function getParent()
    {
    // extend the collection type
    return CollectionType::class;
    }
    }

    与:

    ->createForm(AdressenType::class, $result['extra_address'])

    在 View 中,您可以将其用作:

    <h4>Extra addresses</h4>
    {{ form_start(form_adressen) }}
    {% for address in form_adressen.children %}
    {{ form_errors(address) }}
    {{ form_widget(address) }}
    <br>
    {% endfor %}

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

使用第三个选项时,您可能会在尝试自定义表单呈现时遇到问题。像这样使用自动注入(inject)的 csrf-token 将成为地址的兄弟。如果您尝试访问每个 child 的各个字段,这可能会导致错误。

尽管在这种情况下应该可以使用以下方法:

{% for key, value in form_adressen.vars.data %}
{{ form_row(form_adressen.children[key].AdrStraat) }}
{{ form_row(form_adressen.children[key].AdrHuisnummer) }}
{{ form_row(form_adressen.children[key].AdrPostcode) }}
<br>
{% endfor %}

关于php - 无法访问具有键数组子集的数组中的表单值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47903884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com