Como lidar com dados de formulário dynamic com campos repetidos?

Estou tentando criar um formulário com seções duplicáveis ​​para um site de listview. Deve funcionar assim:

  1. Comece com um formulário de listview -> Preencha o formulário
  2. Clique em “adicionar outro” e outro conjunto de campos duplicados aparece (via jQuery).
  3. Complete o 2º formulário e, em seguida, clique em “adicionar outro”.
  4. Preencha o terceiro formulário. Em seguida, clique em “Enviar”.
  5. Cada conjunto de campo torna-se um rascão, que mais tarde será publicado após o pagamento bem sucedido do WooCommerce (eu descobrirei isso mais tarde).

Estou duplicando os elementos DOM com jQuery semelhante a esta demo da Tristan Denyer.

Estou usando este código de teste básico de prova de conceito para ver como eu posso percorrer os elementos DOM com uma identificação seqüencial ou não sequencial. Nota: Estou ciente de que não há segurança ou validação, apenas tentando obter esse loop para funcionar.

Isto é com uma identificação seqüencial:

$value, 'post_status'=>'draft', 'post_type' => 'apu' ); wp_insert_post( $post_information ); }

Resultados: funciona, há duas postagens criadas, cada uma com um título de publicação como completado no formulário, no entanto, se eu tiver 10 seções duplicadas, cada uma com seu próprio conjunto de cerca de 20 meta-campos, $ testArray rapidamente será um matriz gigante apenas para acompanhar o ID seqüenciado. Eu sinto que um loop foreach não precisa de IDs seqüenciadas, então eu vou apenas criar uma matriz de um conjunto de inputs e, em seguida, percorrer cada conjunto.

Aqui está a minha tentativa sem IDs sequenciadas

  
$value, 'post_status'=>'draft', 'post_type' => 'apu' ); wp_insert_post( $post_information ); }

Resultados: isso só cria uma publicação e o título da postagem é sempre o segundo campo de dados. A primeira publicação não foi criada.

  1. Como posso criar uma postagem por conjunto de campo sem uma matriz cheia de todas as possibilidades de IDs?
  2. Eu preciso incorporar add_post_meta do ID retornado por wp_insert_post. Isso é feito no loop foreach?
  3. Os campos meta (ainda não adicionados) precisam estar em sua própria matriz e para cada loop dentro do foreach original?

Basicamente … o que estou fazendo de errado?

Solutions Collecting From Web of "Como lidar com dados de formulário dynamic com campos repetidos?"

No segundo cenário, você está obtendo o único segundo título, porque você precisa ter nomes de campo exclusivos para cada campo, ou um irá replace o (s) outro (s) em $_POST .

Uma maneira de resolver isso é ter um único campo oculto chamado talvez max_id no qual você armazena o número de identificação mais alto que você usou no formulário – então ele começa em 1 e é incrementado por jquery toda vez que você carrega outro conjunto de campos de formulário.

Então, seu php lê esse campo e faz um loop básico para, começando em 1 até o max_id que foi enviado e lendo os dados do formulário de $_POST . Seria algo assim:

 $max = $_POST['max_id']; for ($i=1; $i < = $max; $i++) { $field_key = 'testfield_' . $i; // process the form data here... // you can add suffix to $field_key if you're working with more than just a title field // ie $some_field = $_POST[$field_key . '_some_field'] // which would correspond to $_POST['testfield_1_some_field'], $_POST['testfield_2_some_field'], etc } 

Segundo cenário

Conforme mencionado nos comentários, você precisa permitir IDs de campo de formulário não sequenciais. Neste caso, eu usaria uma abordagem diferente. Configure um campo oculto e use-o para armazenar o ID do campo do formulário (apenas os números estão bem) e atualize-o adequadamente via jQuery quando novos conjuntos de campos são adicionados / removidos. Por exemplo, você pode acabar com algo assim quando o formulário é submetido e processado pelo PHP:

Então, seu PHP precisa ter o valor desse campo oculto e fazer um loop pelos campos adequadamente:

 $field_ids = explode(',', $_POST['field_ids']); foreach ($field_ids as $id) { $field_key = 'testfield_' . $i; // use the fieldkey to access values in $_POST as need be. }