Como acessar valores de etapas anteriores no formulário da Web com várias páginas?

12

Estou usando o Webform 4. Ele usa os tokens do Drupal, não seus próprios% tokens, como costumava ser na versão 3, e praticamente tudo o que eu encontrei foi sobre o webform 3.

Digamos que eu queira criar um formulário de inscrição com várias páginas. Na primeira página, há apenas um campo de email. No segundo, quero uma marcação que diga algo como:

Configuração detalhada de assinatura para [email protected]

Da mesma forma, gostaria de poder usá-los como valores padrão para campos futuros, como solicitar ao usuário o endereço de cobrança e o endereço de entrega.

Existem tokens para isso? O que fiz por enquanto é:

function mymodule_token_info() {
  $type = array(
    'name' => t('Webform submitted values'),
    'description' => t('Tokens related to $_POST[\'submitted\'].'),
  );
  $tokens = array();
  if(isset($_POST['submitted'])) {
    foreach($_POST['submitted'] as $key => $val) { //discard $val now
      $tokens[$key] = array(
        'name' => $key,
        'description' => "\$_POST['submitted']['$key']",
      );
    }
  }
  return array(
    'types' => array('webform_submitted' => $type),
    'tokens' => array('webform_submitted' => $tokens),
  );
}

function mymodule_tokens($type, $tokens, $data, $options) {
  if($type == 'webform_submitted') {
    $replacements = array();
    foreach ($tokens as $name => $original) {
      //Hide errors below. We don't care if it really exists yet. If empty, so be it.
      @$replacements[$original] = (string)$_POST['submitted'][$name];
    }
    return $replacements;
  }
}

Funciona, mas mostra apenas os valores de uma etapa anterior, por isso requer alguns truques sujos com campos ocultos para transportar o valor do email em várias etapas. Eu admito - foi apenas rápido e sujo. Existe alguma built-in maneira de fazê-lo, ou devidamente mantido contribuiu módulo para isso? Ou uma maneira de fazer esse código funcionar independentemente $_POST['submitted'], de transportar valores por várias etapas e de tornar seus tokens (dos elementos disponíveis do Webform) visíveis na lista de tokens nas janelas de edição?

Mołot
fonte
Você pode definir uma variável de sessão ao enviar a página com o valor desejado?
precisa saber é o seguinte
@ Darvanen possivelmente eu poderia, mas o valor já está salvo em algum lugar, certo? Então, eu preferiria usar o que já está lá. E mal acredito que sou o primeiro a precisar disso. Provavelmente não consegui encontrar a solução que existe por aí?
Mołot 19/01
Não tenho certeza sobre esse $ form_state ['storage'], mas pesquisei 2 ou 3 postagens que mencionaram todos os dados armazenados em $ form_state ['storage'], então acho que você pode acessar os dados, fonte stackoverflow.com/questions/ 6408170 /… e drupal.org/node/717750
Bala
2
@Bala isso funciona em todas as formas de alteração de gancho, tudo bem. Mas como eu obteria o estado do formulário em tokens? Quero dizer, vou deixar este emprego em duas semanas. O indivíduo que cuidará desse formulário não é um codificador, ele pode fazê-lo, mas essa não é sua principal habilidade - é por isso que preciso de tokens.
Mołot 19/01
Sim, você mencionou para necessidades futuras que eu esqueci completamente.
Bala

Respostas:

1

Isso não responde à pergunta em seu título, mas a leitura do seu caso de uso parece o cenário para o qual o Profile2 foi escrito. Post relacionado do stackoverflow

O Webform é ótimo para pesquisas e tal, mas quando você deseja "poder usá-los como valores padrão para campos futuros", eles precisam estar conectados ao usuário. Portanto, você precisaria de mais código personalizado para buscar o envio do formulário da web histórico do usuário para extrair esses valores de uma forma alterada para o seu endereço de cobrança. O perfil (2) foi escrito precisamente para facilitar isso.

Além disso, quanto menos codificação personalizada de última hora você estiver fazendo antes de entregá-la a mais alguém, menos alguém mais o amaldiçoará quando estiver tentando fazer atualizações.

DeveloperWeeks
fonte
Tudo bem e legal, mas uma coisa que esse formulário não era é um perfil :( Quero dizer, não queremos criar perfis para pessoas que solicitam inscrições. Diferentes leis se aplicam quando você faz, mais rigorosas. Ou então, eu estava dito pelo departamento jurídico Além disso, agora eu preciso dele para casos de uso totalmente independentes, se em tudo :).
MOLOT
Ok, isso é interessante o que sua equipe jurídica disse. Conclusão: se você quiser preencher previamente formulários com dados conectados ao usuário, precisará de dados conectados ao usuário. O módulo Profile era uma maneira mais fácil de manter essa capacidade de dados e uma correspondência bastante próxima das funções que você estava solicitando. Altere as permissões do site para que ninguém possa visualizar perfis, e agora é o mesmo que você deseja, mas com um código mais padrão. Só porque o módulo é nomeado Perfil, não significa que ele precise ser implantado como tal.
DeveloperWeeks
0

Decalre as variáveis ​​como globais e passe de_state [values] [] para elas. Isso funcionou para mim, em formulários de vários estágios com o pop-up modal do ctools.

ana
fonte