Prestashop 1.6: come aggiungere un campo al modulo Contatti

Continuiamo la nostra serie di tutorial dedicati a Prestashop con una breve guida che spiega come aggiungere un campo personalizzato al modulo di contatti presente nell’installazione standard di Prestashop.

Quando partiamo da un’installazione pulita di Prestashop, utilizzando il tema standard, abbiamo la fortuna di avere un form di richiesta informazioni già bello e pronto, solitamente raggiungibile dalla voce “Contattaci” presente in alto a destra.
L’unico problema è che i campi sono veramente pochi: come possiamo fare per aggiungerne uno nuovo?
Vediamo subito un esempio su come possiamo aggiungere un campo “Nome”.

1. Apriamo il file del tema “contact-form.tpl”, che si trova nella cartella principale del tema (“themes/default-boostrap”)

 

2. Intorno alla riga 90, dopo il div che visualizza il campo email, aggiungiamo il codice qui sotto: il nuovo campo si chiamerà “nome”.

<!-- Inserimento campo Nome -->
<p class="form-group">
<label for="nome">{l s='Nome'}</label>
{if isset($customerThread.nome)}
<input class="form-control grey" type="text" id="nome" name="nome" value="{$customerThread.nome|escape:'html':'UTF-8'}" readonly="readonly" />
{else}
<input class="form-control grey validate" type="text" id="nome" name="nome" value="{$nome|escape:'html':'UTF-8'}" />
{/if}
</p>
<!--// Fine Inserimento campo Nome -->

 

3. Prendiamo il file ContactController che si trova nella cartella “controllers”, copiamolo e incolliamolo dentro la cartella “override/controllers/front”.

 

4. Nel nuovo file creato riscriviamo la prima riga con la definizione della classe in questo modo:

class ContactController extends ContactControllerCore

 

5. Intorno alla riga 40 dello stesso file aggiungiamo questa riga:

$nome = Tools::getValue('nome');

 

6. Intorno alla riga 46, aggiungiamo prima della serie di “else if” queste due righe (in questo modo l’errore che invita a compilare il campo Nome sarà il primo a comparire)

else if (!$nome) $this->errors[] = Tools::displayError('Il campo nome è obbligatorio');

 

7. Intorno alla riga 164 c’è un array: aggiungiamo come ultimo elemento la riga: ‘{nome}’ =>  $nome, l’array diventerà come questo:

$var_list = array(
'{order_name}' => '-',
'{attached_file}' => '-',
'{message}' => Tools::nl2br(stripslashes($message)),
'{email}' =>  $from,
'{product_name}' => '',
'{nome}' =>  $nome,
);

 

8. Ora vanno modificati i due file con il testo della mail inviata all’utente, in modo di aggiungere il riferimento al nuovo campo “Nome”: questi sono “contact_form.txt” e “contact_form.html” dentro la cartella “mails” (sottocartella “it”) per la lingua italiana.
Nel file “contact_form.txt” aggiungiamo la riga:

NOME: {nome}

Nel file contact_form.html, aggiungiamo la riga:

Nome: {nome}

 

Abbiamo finito! Se tutto va bene ora aprendo la pagina del modulo troveremo il nuovo campo Nome da compilare e nella mail ricevuta troveremo una riga in più con il valore del nuovo campo Nome.

 

Condividi questo articolo

14 commenti

  • L’articolo è davvero ben fatto! Sono riuscita a fare tutto anche con pochissime conoscenze di programmazione.
    Mi rimane ancora una piccola cosa da sistemare: quando genero l’errore lasciando i campi vuoti compare un messaggio es. “C’è un errore. 1 Email non valida”, ma lasciando il nuovo campo nome vuoto il messaggio di errore è incompleto “C’è un errore. 1 “.
    Potresti indicarmi come sistemare questo errore?
    Grazie
    Silvia

    • Ciao Silvia,
      controlla di aver seguito correttamente i punti 5 e 6 dell’articolo.
      In particolare la riga:
      else if (!$nome) $this->errors[] = Tools::displayError(‘Il campo nome è obbligatorio’);
      è quella che visualizza il messaggio di errore nel caso la variabile $nome (definita al punto precedente) sia vuota.

  • grazie del tutorial Enrico, ma ho qualche problema; i campi aggiunti sono nome, telefono, citta;
    ma quando apro il form, dentro gli input appare:
    Notice: Undefined index: nome in /home/miosito/public_html/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()’d code on line 153Notice: Trying to get property of non-object in /home/miosito/public_html/tools/smarty/sysplugins/smarty_internal_templatebase.php(157) : eval()’d code on line 153

    Poi vorrei sapere:
    – come li vedo nel backoffice? devo creare i campi nel db? (in realtà l’ho già fatto..)
    – contact_form.txt e html sono gli stessi che arrivano anche al venditore?

    Questo è il mio primo sito prestashop, mi rendo conto che è meno semplice di come pensassi. Spero vivamente tu possa aiutarmi! Grazie.

    • Ciao Antonello, per quanto riguarda il primo errore: controlla bene il file contact_form.tpl, deve esserci qualche errore nell’utilizzo della variabile “nome”, senza vedere il codice è difficile capire quale.
      Per le altre due domande:
      – I dati personalizzati non li vedi nel backoffice, non l’ho previsto nel tutorial perchè è abbastanza complicato da implementare. Potresti però risolvere in due modi: in modo simile a come ho spiegato nel tutorial potresti modificare il file “contact.txt”, dentro la cartella “mails”, aggiungendo i tuoi campi personalizzati. Questo file contiene il testo che viene inviato all’amministratore (e questa è la risposta anche alla tua seconda domanda).
      La seconda soluzione è quella di modificare il file “ContactController” facendo in modo che il valore dei tuoi campi personalizzati venga aggiunto alla fine del campo “message”. In questo modo quando accedi al pannello di amministrazione puoi vedere i tuoi campo personalizzati, senza bisogno inserire dei nuovi campi sul database o di modificare le pagine di amministrazione.

  • Ottimo articolo, veramente utile!
    Nel form di registrazione come si può nascondere un campo (es. P.IVA) in modo che chi si registra non lo veda?
    Grazie.

    • Per nascondere un campo ti basta inserirlo come campo hidden nel “contact-form.tpl”, ovviamente senza inserigli nessuna label.

  • Se avete problemi di visualizzazione dei valori dei nuovi campi nelle email, provate a cancellare il file class_index.php in /cache!

  • Ottimo articolo, seguito passo passo non da nessun problema. Una domanda: Ma se volessi inserire nel modulo standard invece di un campo Nome un checkbox per la privacy la procedura è la medesima solo che bisogna cambyare il type in input class al punto 2?

    • Ciao Leonardo, si la procedura è abbastanza simile. Come dici tu devi cambiare il tipo di input nel file .tpl, poi nel file del controller devi stare però attento a gestire bene il valore del campo che ti arriva in post, perchè se il flag viene selezionato dall’utente non ci sono problemi ma se non viene selezionato non ti arriverà nessun valore in post, quindi l’istruzione al punto 5 dovrebbe andare in errore (non sono sicuro perchè non l’ho testato).

  • Ciao Enrico, è la mia prima esperienza con prestashop, ho seguito il tuo tutorial che reputo davvero interessante, per l’inserimento del campo ‘nome’ nel form ‘contattaci’ ma ho riscontrato un problema. Quando dal frontend inserisco un valore nel campo nome, anzichè ritrovarmi nella mail il valore digitato in input in corrispondenza del campo, ricevo il seguente risultato:
    Nome: {nome}
    è come se all’array non arrivasse l’input inserito nel campo nome restituendomi di fatto come risultato: {nome}
    Potresti aiutarmi a risolvere il problema?
    Grazie!!!

  • Ciao Gianni, senza vedere il codice è difficile darti una risposta.
    Intanto controlla che nell’array al punto 7 ci sia la riga con il nome, e se è così, prima di questa dichiarazione di array prova a stampare in output la variabile $nome per capire se è valorizzata.

  • Ciao Enrico, ho seguito passo passo la tua guida descritta molto bene ed il campo nome è stato inserito nella pagina dei contatti, quando ricevo la mail però nel corpo ritrovo la stringa Nome: {nome} e non il valore del campo nome inserito nel form, c’è da inserire anche il campo nome a livello di db, oppure dove sbaglio?
    Grazie in anticipo

    • Ciao Stefano, con il sistema che ho spiegato nel tutorial non è necessario salvare i campi nel database. Da quello che mi dici sembrerebbe che il campo {nome} non sia presente nei campi che passi alla mail, quindi dovresti controllare che negli elementi dell’array $var_list sia presente la riga con {nome} e che sia valorizzata correttamente.

Leave a comment