• User

    Inviare dati da form in PDF dopo il submit

    Salve a tutti.
    Ho gia un form, che si occupa di creare un preventivo. Questo funziona benissimo, in quanto una volta compilato il form, questo viene spedito nel mio indirizzo email con tutti i campi compilati.
    Io vorrei che oltre ad avere la mail normale, venga allegato in formato PDF, tutto il form, cosi che io possa scaricarlo.
    Mi hanno detto di utilizzare la libreria dompdf, ma non riesco a capirne il funzionamento.
    Dovrei richiamare la libreria dopo il submit?
    Utilizzo PHP MAILER con AJAX.
    Nell Ajax.php ci sono tutti i form. Devo includere li la libreria o direttamente nell index.php nel bottone submit?

    Il bottone nell index è strutturato cosi

    [PHP] <div id="f1_upload_process" class="form-group" style="display:none;">
    <label class="col-md-2 control-label label_defaults"></label>
    <img src="media/images/loader.svg" width="32" />
    </div>
    <div class="form-group">
    <label class="col-md-2 control-label label_defaults"></label>
    <input type="submit" name="ifg-formfield-29" id="ifg-formfield-29" value="invia ordine" class="btn btn-success" onclick="submitClicked();return false;" />
    </div>[/PHP]


  • User Attivo

    Dovresti crearti lo script su un file .php a parte,

    che fa quello che deve fare,
    dove (QUI) inserisci tutte le librerie che lavorano con PDf caricando i valori che gli dai con ajax,

    e poi da qui generi l'azione (es. invio email, store in db, altro).


  • User

    grazie,
    lo script per dompdf l'ho gia creato seguendo i tutorial in rete ed è questo :

    [PHP]<?
    require_once("dompdf/dompdf_config.inc.php");
    spl_autoload_register('DOMPDF_autoload');
    function pdf_create($html, $filename, $paper, $orientation, $stream=TRUE)
    {
    $dompdf = new DOMPDF();
    $dompdf->set_paper($paper,$orientation);
    $dompdf->load_html($html);
    $dompdf->render();
    $dompdf->stream($filename.".pdf");
    }
    $filename = 'nama_file';
    $dompdf = new DOMPDF();
    $html = file_get_contents('file_html.php');
    pdf_create($html,$filename,'A4','portrait');
    ?>[/PHP]

    In pratica questo script dovrebbe convertire la pagina file_html.php in pdf e effettivamente lo fà. Ora il problema è integrarlo nel form e dirgli che la pagina convertita in PDF ( a questo punto penso sia l'index.php ) venga spedita assieme alla compilazione nella mia email. Non riesco bene ad integrare questo codice nel mio form.
    Per capire come è strutturato il mio form, questa è la index.php ( pastebin.com/8miHCdUv ) e questo il mio ajax.php ( pastebin.com/36DXuEfx ) dove sono inseriti tutti i moduli del form.

    Dovrei reindirizzare lo script in che zona del form? questo non riesco a capire.

    grazie.


  • User Attivo

    Dovresti far tutto sempre dentro quello scriopt, o da uno che faccia da file di livello superiore,
    che poi sia index.php o Ajax.php è indifferente, è solo una questione di strutturazione, ma questa la devi vedere tu che hai tutti i files.

    Quando tu invii il form, fai che la sua action sia in un file che invia le email es ajax.php

    qui sopra, prima di far inviare la mail, fai creare il pdf con i dati che tu gli hai passato via _POST (quindi includi lo script qui sopra postato dentro ajax.php, prima dell'invio della mail)

    (questi vanno a popolare un probabile template che hai creato in precedenza per fare il PDF)
    e si crea un PDF

    Poi semplicemente inviii la mail** allegando **il PDF generato, mentre gli stessi campi presi dal _POST li usi nell'invio della mail.


  • User

    @Artigiani del Web said:

    Dovresti far tutto sempre dentro quello scriopt, o da uno che faccia da file di livello superiore,
    che poi sia index.php o Ajax.php è indifferente, è solo una questione di strutturazione, ma questa la devi vedere tu che hai tutti i files.

    Quando tu invii il form, fai che la sua action sia in un file che invia le email es ajax.php

    qui sopra, prima di far inviare la mail, fai creare il pdf con i dati che tu gli hai passato via _POST (quindi includi lo script qui sopra postato dentro ajax.php, prima dell'invio della mail)

    (questi vanno a popolare un probabile template che hai creato in precedenza per fare il PDF)
    e si crea un PDF

    Poi semplicemente inviii la mail** allegando **il PDF generato, mentre gli stessi campi presi dal _POST li usi nell'invio della mail.

    Inanzi tutto sei stato gentilissimo a rispondermi ancora e a spiegarmi il tutto, solo che non ostante ci stia provando, quando provo ad inserire lo script in ajax.php nel momento in cui clicco su submit per inviare il tutto, questo non funziona più.
    Magari puoi dargli una sbirciata qui per capire un pò come è strutturato e darmi un ultima dritta? qui il mio test form ( lordzz.altervista.org/testform.zip ) . in ajax.php trovi nel emailConfig la mia per testare lo script, l'ho rinominata " quilamiamail[dot]mail.it ".


  • User

    P.S. : Io non voglio che si crei un PDF che si appoggi ad un template, ma voglio che proprio tutto il form cosi com'è si autoconverta in PDF ed è quello che dompdf in teoria dovrebbe fare, solo che non ancora riesco a capire dove sbaglio.


  • User Attivo

    Eh ma non puoi direttamente perchè qui stai lavorando con JSON.

    L'unico modo che hai è aggiungere una funzionalità dentro **ajax.php **

    (Fra l'altro ho visto che dentro ajax.php c'è una funzione che serve per storare tutti i dato dentro un database, se ti serve, puoi inserire di dati del db dentro /includes/config.php.)

    Comunque,
    devi inseire uno script dopo** riga 314**, prima di
    [PHP]//Check if dtabase options[/PHP]

    (ad esempio, sennò dove vuoi)

    Tutti i tuoi dati soo dentro la variabile [PHP]$message[/PHP].

    A questo punto prendi la variabile e la butti dentro un pdf, che sia con questa libreria o con altre vedi tu (adesso non ho il tempo di testare la singola libreria, ma puoi provare tu)

    Poi con il pdf ci fai quello che vuoi.

    VARIANTE2)* Se invece lo vuoi mandare direttamente dentro la stessa email, *
    intervieni a riga 273 circa e aggiungi una funzione dopo:

    [PHP] if(isset($files) && count($files) > 0){
    foreach($files as $file){
    if($file['file_email_attach_type'] == 'linknattach' || $file['file_email_attach_type'] == 'attach'){
    $mail->AddAttachment("../media/uploads/".$file['name']);
    }
    }
    }[/PHP]

    Dove prima generei il pdf con la libreria, e dopo gli dici che c'è un allegato

    [PHP] // Generate PDF here
    [...] dompdf --> $message [...]

    // Add PDF
    $mail->AddAttachment("../media/uploads/".$nome_pdf);
    [/PHP]


  • User

    per prima cosa, ancora grazie!.

    Allora lo script per generare il PDF sarebbe cosi ( come da te suggerito li ho messi dopo la linea 280 :

    [PHP]
    // Generate PDF here
    require_once("../dompdf/dompdf_config.inc.php");

                        $dompdf = new DOMPDF(); // Crea una nuova istanza per dompdf
                        $dompdf->load_html($message); // carica html
                        $dompdf->render(); // Analizza il codice html e lo trasforma in PDF
                        $pdf_content = $dompdf->output(); // mette i contenuti della variabile nel pdf
                        file_put_contents('../dompdf/ordine.pdf',$pdfoutput); 
                
                  // Add PDF 
                    $mail->AddAttachment("../dompdf".$ordine); // prende il file e lo invia [/PHP]
    

    invia la mail con i dati ma continua a non funzionare 😕


  • User Attivo

    la variabile $ordine dove l'hai dichiarata?


  • User

    no, scusami il metodo esatto per inviare è cosi :

    $mail->AddAttachment("../dompdf/ordine.pdf"); // prende il file e lo invia

    comunque il problema è che ora crea il file come di norma in ../dompdf, che poi in teoria una volta spedito dovrà essere cancellato, altrimenti chi rifà un ordine, avrà il pdf precedentemente creato dall utente precedente, ma non viene comunque spedito assieme alla mail e una volta aperto viene come danneggiato...

    Appena lo apro scrive " il file non è supportato oppure è stato danneggiato ( ad esempio è stato inviato come allegato ad un indirizzo email e non è stato decodificato correttamente )


  • User Attivo

    Per ovviare basta che aggiungi un numero alla fine, magari un timestamp, quindi ti arriva /ordine3245252.pdf e cosi via.

    Per qaundo riguarda il pdf, questo riguarda al libreria che crea il pdf.
    Prova a testarla "standalone" e vedi se riesci ad ottenere dei files leggibili.

    Ovvero, prendi la libvreria e testi da una'ltra oparte in locale con dei dati demo, vedi se si legge o meno finchè non capisci come formatatre i dati.


  • User

    ok, sono riuscito a inviare l'allegato, anche se questo genera sempre un pdf danneggiato. Per caso non riesce a renderizzare e o creare il pdf perche' quando gli do i campi $message , questo vuole che vadano che sò, su un template come fpdf? Anche se io non vorrei questo, vorrei che proprio la pagina dell index si trasformasse in PDF. Anche perchè proprio per questo mi hanno consigliato dompdf, per non fare uso di template e costruirmene uno e disegnarlo cella per cella.


  • User

    @Artigiani del Web said:

    Per ovviare basta che aggiungi un numero alla fine, magari un timestamp, quindi ti arriva /ordine3245252.pdf e cosi via.

    Per qaundo riguarda il pdf, questo riguarda al libreria che crea il pdf.
    Prova a testarla "standalone" e vedi se riesci ad ottenere dei files leggibili.

    Ovvero, prendi la libvreria e testi da una'ltra oparte in locale con dei dati demo, vedi se si legge o meno finchè non capisci come formatatre i dati.

    oooh! Finalmente ci sono riuscito! il codice esatto è questo :

    [PHP] // Generate PDF here
    require_once("../dompdf/dompdf_config.inc.php");
    spl_autoload_register('DOMPDF_autoload');

                        $dompdf = new DOMPDF(); // Crea una nuova istanza per dompdf
                        $dompdf->load_html($message); // carica html
                        $dompdf->render(); // Analizza il codice html e lo trasforma in PDF
                        $pdf_content = $dompdf->output(); // mette i contenuti della variabile nel pdf
                        file_put_contents('../dompdf/ordine.pdf',$pdf_content);[/PHP]
    

    Ora funziona tutto meravigliosamente, alla fine non c'è nemmeno bisogno che ogni volta cancelli il pdf o crei un timestamp perchè ogni qual volta che si crea un nuovo ordine, questo sovrascrive il precedente e mi invia quello attuale, quindi mi va bene cosi.

    Grazie veramente, senza i tuoi consigli starei ancora a sbatterci la testa dietro! Se abitassimo vicini ti offrirei una birra.. ma anche due!

    Un ultima cosa, nel form in pratica ci sono anche delle immagini. Ad esempio prima dell'inizio dei campi c'è il logo che nell' ajax.php nella 8ht riga " **$form_info['form_info'] = ** " c'è "upload_img":"1448545091_1.jpg","img_url":"" però nella mail non c'è e si vedono solo i campi compilati. Poi non ho capito perchè c'è solo il nome del file e non la directory, perchè il file risiede in media/uploads/ .

    Mi sfugge qualcosa? C'è modo che nella mail compaia anche il logo prima dei dati del form? E' una questione di pura estetica, per non far sembrare il pdf troppo spoglio e minimale.