¿Cómo acceder a los valores de los pasos anteriores en el formulario web de varias páginas?

12

Estoy usando Webform 4. Utiliza los tokens de Drupal, no sus propios tokens% como solía hacerlo en la versión 3, y casi todo lo que encontré fue sobre el formulario web 3.

Digamos que quiero hacer un formulario de suscripción de varias páginas. En la primera página solo hay un campo de correo electrónico. En el segundo, quiero un marcado que diga algo como:

Configuración de suscripción detallada para [email protected]

Del mismo modo, me gustaría poder usarlos como valores predeterminados para futuros campos, como pedirle al usuario la dirección de facturación y luego la dirección de entrega.

¿Hay alguna ficha para eso? Lo que hice por ahora es:

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, pero solo muestra valores de un paso anterior, por lo que requiere algunos trucos sucios con campos ocultos para llevar el valor del correo electrónico a través de múltiples pasos. Lo admito, fue rápido y sucio. ¿Hay alguna forma integrada de hacerlo, o un módulo contribuido mantenido adecuadamente para esto? ¿O una forma de hacer que este código funcione de manera independiente $_POST['submitted'], para que lleve valores a través de muchos pasos y hacer que sus tokens (de los elementos de formulario web disponibles) sean visibles en la lista de tokens en las ventanas de edición?

Mołot
fuente
¿Podría establecer una variable de sesión cuando envíe la página con el valor deseado?
Darvanen
@Darvanen posiblemente podría, pero el valor ya está guardado en alguna parte, ¿verdad? Entonces preferiría usar lo que ya está allí. Y apenas creo que sea el primero en necesitar esto. ¿Probablemente no logré encontrar la solución que existe?
Mołot
No estoy seguro acerca de este $ form_state ['almacenamiento'] pero busqué en 2 o 3 publicaciones que mencionaron todos los datos almacenados en $ form_state ['almacenamiento'], así que creo que puede acceder a los datos, fuente stackoverflow.com/questions/ 6408170 / ... y drupal.org/node/717750
Bala
2
@Bala, esto funciona en todos los formularios de alteración de gancho, de acuerdo. Pero, ¿cómo obtendría el estado del formulario en tokens? Quiero decir, dejaré este trabajo en dos semanas. El tipo que se encargará de esta forma no es un programador, puede hacerlo, pero esa no es su habilidad principal, por eso necesito fichas.
Mołot
Sí, lo mencionaste para futuras necesidades, lo olvidé completamente
Bala

Respuestas:

1

Esto no responde a la pregunta en su título, pero leer su caso de uso suena como el escenario para el que se escribió Profile2 . Publicación relacionada de stackoverflow

Webform es ideal para encuestas y demás, pero cuando desea "poder usarlos como valores predeterminados para campos futuros", deben estar conectados al usuario. Por lo tanto, necesitaría más código personalizado para obtener el envío histórico del formulario web del usuario para extraer estos valores en un formulario diferente para su dirección de facturación. El perfil (2) está escrito precisamente para facilitar esto.

Además, cuanto menos codificación personalizada de última hora esté haciendo antes de pasar esto a otra persona, menos será que alguien más lo maldecirá en su corazón cuando intente realizar actualizaciones.

DeveloperWeeks
fuente
Todo bien y agradable, pero una cosa que este formulario no era es un perfil :( Quiero decir, no queríamos crear perfiles para personas que solicitaban suscripciones. Se aplican diferentes leyes cuando lo haces, más estrictas. O eso era dicho por el departamento legal. Además, ahora lo necesito para casos de uso totalmente no relacionados, si es que lo hay :)
Mołot
Bien, eso es interesante lo que dijo su equipo legal. En pocas palabras, si desea rellenar previamente formularios con datos conectados al usuario, necesita datos conectados al usuario. El módulo Perfil era una forma más fácil de mantener esa capacidad de datos y una coincidencia bastante estrecha para las funciones que solicitaba. Cambie los permisos del sitio para que nadie pueda ver los perfiles, y ahora es lo mismo que desea pero con un código más estándar. El hecho de que el módulo se llame Perfil no significa que deba implementarse como tal.
DeveloperWeeks
0

Calcule las variables como globales y pase from_state [values] [] a ellas. Esto funcionó para mí, en formas de etapas múltiples con ventana emergente modal de ctools.

ana
fuente