Come rendere "condizionali" i campi del form di contatto?

20 contenuti / 0 new
Ultimo contenuto
Come rendere "condizionali" i campi del form di contatto?

Ciao,
devo estendere le funzionalità del modulo contatti. Seguendo le info sul forum ufficiale ho creato un mini modulo per aggiungere dei campi, inserendo nuovi elementi nell'array che andrà a comporre il form stesso, usando un hook e questa sintassi:

if ($form_id == 'contact_mail_page') {
    $form['phone'] = array(
      '#type' => 'textfield',
      '#title' => t('Your phone number'),
      '#maxlength' => 255,
      '#default_value' => $edit['phone'],
      '#required' => true,
    );

E tutto fila liscio ma il problema è un'altro: ho bisogno che due "checkbox" (settate entrambe come "obbligatorie") si attivino alternativamente alla selezione di determinate categorie (destinatari della mail).

Esampio:

  • Destinatario: Gino >> Appare la checkbox obbligatoria: Numero 1 (ma non la 2)
  • Destinatario: Pino >> Appare la checkbox obbligatoria: Numero 2 (ma non la 1)

Da parte mia le fare sparire volentieri via CSS ma il problema è che se creo le checkbox come obbligatorie vengono richiesti a prescindere dalla loro visibilità.

Molti mi potranno dire:"usa webform"! Il problema è che Webform salva nel database e ho necessità che questa roba NON finisca assolutamente nel DB (altrimenti avevo già risolto!).

Qualcuno ha idee di come settare un campo condizionale legato alla scelta del destinatario?
(vi dico subito che il modulo Contact Field non lo fa ed è stata proposta come feature futura)

Ciao e grazie!

Puoi usare il modulo webform

ealmuno wrote:
Puoi usare il modulo webform
XD

...ehm.... veramente avevo scritto:

Dret wrote:

Molti mi potranno dire:"usa webform"! Il problema è che Webform salva nel database e ho necessità che questa roba NON finisca assolutamente nel DB (altrimenti avevo già risolto!).

:D

basta che modifichi il modulo, trovi la query e non la esegui, oppure ogni tanto lo fai manualmente, non credo ci siano problemi di questo genere, almeno che tu non abbia migliaia di utenti

Il problema è assai peggiore: per motivi di Privacy quei dati NON devono essere salvati in alcun modo.

Quindi Webform lo escluderei (tra l'altro non ha una bella gestione degli errori nell'invio mail).

Devo cercare qualcosa che si integri con Contact.

PEr motivi di privacy, quando uno invia una mail deve accettare la privacy policy per l'utilizzo della sua mail, un sito deve poter tracciare e salvare certe cose, anche in caso di investigazioni della polizia postale. Se poi l'uso è sbagliato è tutto un altro discorso

Il problema è che la Privacy Policy prevista per questo servizio NON DEVE prevedere il data storing per questi dati e la cosa non è modificabile (comporterebbe una serie di adeguamenti molto onerosi per il titolare del sito).

Sorry!
;)

Forse ho trovato una soluzione:

mi basterebe aggiungere al tag SELECT (che visualizza la lista dei destinatari) l'istruzione javascript:

onchange="aggiornatesto(this)"

Consigli per fare questo semplice override?

ciao, potresti prendere spunto da questa discussione che ho aperto qualche giorno fa (http://www.drupalitalia.org/node/13060).
Credo ti basti usare drupal_add_js e richiamare la funzione caricandola negli #attributes dell'elemento del form.

uhm... ho provato queste sintassi:

function extramailfield_form_alter(&$form, $form_state, $form_id){
  if ($form_id == 'contact_mail_page') {

con

  $form['contact_mail_page']['cid']['#attributes']=array('onchange' => 'mostraDiv(this.value)');

oppure

             $form['cid']['#attributes']=array('onchange' => 'mostraDiv(this.value)');

o anche

         $form['cid'] = array('#type' => 'select',
'#attributes'=array('onchange' => 'mostraDiv(this.value)'),
        '#title' => t('Recipient'),
        '#default_value' => $default_category,
        '#options' => $categories,
        '#required' => TRUE,
      );

ma nada...!! Sicuramente sto sbagliando qualcosa....

Dret wrote:
uhm... ho provato queste sintassi:

function extramailfield_form_alter(&$form, $form_state, $form_id){
  if ($form_id == 'contact_mail_page') {

con

  $form['contact_mail_page']['cid']['#attributes']=array('onchange' => 'mostraDiv(this.value)');

oppure

             $form['cid']['#attributes']=array('onchange' => 'mostraDiv(this.value)');

o anche

         $form['cid'] = array('#type' => 'select',
'#attributes'=array('onchange' => 'mostraDiv(this.value)'),
        '#title' => t('Recipient'),
        '#default_value' => $default_category,
        '#options' => $categories,
        '#required' => TRUE,
      );

ma nada...!! Sicuramente sto sbagliando qualcosa....


Domanda stupida: hai pulito la cache dopo aver attivato il modulo?
In ogni caso ti converrebbe installare qualche estensione mirata allo sviluppo come drupal for firebug per conoscere l'esatta struttura degli elementi (in questo caso il form contact_mail_page) oppure aiutarti con la print_r.

Si la cache è stata pulita e uso firebugs!

... ma ho avuto indicazioni simili anche sul form internazionale (per questo problema) con gli stessi risultati, c'è qualcosa che non quadra nella sintassi che definisce l'array degli attirbuti del campo.

Comunque trattandosi del modulo standard per i contatti è visibile un'esempio su qualunque sito Drupal che non sia stato modificato pesantemente in quell'area. Io al massimo ho agginto dei campi ma non al momento non avevo "Modificato" nessuno.

Ora do un'occhiata con la print_r...

Grazie...

Per non salvare i dati nel DB, basta che… li cancelli subito dopo il salvataggio. Dovresti poterlo fare implementando un hook_form_alter che aggiunge una funzione submit al salvataggio del webform che hai creato.

Grazie pinolo.. il fatto è che ho fatto "quasi tutto"... mi manca solo attribuire questo benedetto attributo "onchange" alla SELECT "categoria"... e poi ho risolto senza necessità di installare Webform.

Purtroppo il suggerimento di uastasi qui sembra non funzionare... ma sono sicuro che è sia problema di sintassi...

[RISOLTO] Il problema derivava da una dimenticanza:

Avevo utilizzato il modulo tContact per tradurre tutti i campi, le form e le option del modulo contatti in varie lingue. Questo ottimo modulo (ma in questo caso bastardo!) fa l'override della funzione sopra citata riscrivendo daccapo tutto l'array per l'elemento [cid]. Ergo rendeva inutile ogni tentativo di ulteriore override sull'originale!

A questo punto ho aggiunto direttamente in tContact:

'#attributes' => array('onchange' => 'mostraDiv(this.value)'),

e tutto funziona... ora completo il lavoro poi vi posto la soluzione completa se può interessare.

grazie a tutti...

... piccolo problemino, ho modificato il javascript di uastasi (questo!) per le mie esigenze così:

function mostraDiv(value){
    if (value == 'Webmaster') {
      document.getElementById('privacy_1').setAttribute('class', 'visi');
  document.getElementById('privacy_2').setAttribute('class', 'hide');
    }
else {
  document.getElementById('privacy_1').setAttribute('class', 'hide');
  document.getElementById('privacy_2').setAttribute('class', 'visi');
    }
}

In pratica fa lo switch della visibilità di un terzo e un quarto blocco a seconda del valore inserito.

Funziona perferttamente su Firefox, Opera, Chrome, SAfari, IE8... non su IE6-7... qualche dritta per standardizzarlo?

Ok risolto con jquery!

function mostraDiv(value){
    if (value == '1' ) {
    $('#nome_campo_a').removeClass('hide');
    $('#nome_campo_a').addClass('visi');
$('#nome_campo_b').removeClass('visi');
    $('#nome_campo_b').addClass('hide');
  }
  else {
$('#nome_campo_a').removeClass('visi');
    $('#nome_campo_a').addClass('hide');
$('#nome_campo_b').removeClass('hide');
    $('#nome_campo_b').addClass('visi');
    }
}

Tra poco mostro la soluzione completa!

Soluzine completa al problema: Aggiungere un campo condizionale a seconda del destinatario nel modulo contact

1) serve creare un nuovo modulo che vada a sovrascrivere la funzione che crea il form in questione usando un hook_form_alter (considerare anche eventuali altri moduli che agiscono sul form Contatti).

La sintatssi:

function nomesceltoperilmodulo_form_alter(&$form, $form_state, $form_id){
if ($form_id == 'contact_mail_page') {

2) Aggiungere all'array dei campi uno o più campi di testo su cui operare lo switch, con questa sintassi, in questo caso è uno switch tra due:

$form['nome_campo_a'] = array(
'#value' => t('Testo da mostrare.'),
'#prefix' => '<div id="nome_campo_a" class="hide">',
  '#suffix' => '</div>',
);
$form['nome_campo_b'] = array(
'#value' => t('Altro Testo da mostrare.'),
'#prefix' => '<div id="nome_campo_b" class="visibile">',
  '#suffix' => '</div>',
);

3) Aggiungere all'elemento dell'array ['cid'] il javascript per operare lo switch sul menù categorie, se altri moduli operano già un override potete operare direttamente su questo secondo modulo (es. tContact).
Vedi ultima riga del codice sottostante

        $form['cid'] = array('#type' => 'select',
        '#title' => t('Category'),
        '#default_value' => $default_category,
        '#options' => $categories,
        '#required' => TRUE,
'#attributes' => array('onchange' => 'mostraDiv(this.value)'),  //MOD
      );

4) Caricare sulla pagina il codice jquery riportato al post precedente e modificare questa riga, scegliendo quali elementi fanno scattare lo switch :

if (value == '1' ) {

Per conoscere il "value" degli elementi OPTION della SELECT "Categoria", basta controllare il codide HTML della pagina.
(In alternativa: potete anche far caricare un file .js esterno direttamente dal modulo: c'è un esempio sul modulo di unstasi; vedi link nei post precedenti)

5) Aggiungere al foglio di stile:

.hide {display:none;}
.visi {display:block;}

Funziona su tutti i browser IE, FIrefox, Opera, Chrome, Safari (garantisce jquery!)