PDF on the fly met CF7

Warmteschilden configuratie

Een paar jaar geleden werd mij gevraagd een Wordpress plugin te ontwikkelen waarbij simpel gezegd informatie uit een webformulier naar een PDF moest worden omgezet die vervolgens als bijlage in een e-mail moest worden opgenomen die door de webserver naar de inzender en naar de eigenaar van de website werd gestuurd. De precieze reden voor deze procedure weet ik niet meer. Het te gebruiken formulier was ContactForm7. Lees verder om te kijken hoe ik dit gedaan heb:

ContactForm7 biedt een aantal hooks waarmee op verschillende momenten kan worden ingegrepen op het verzend proces.

De PDF kan worden gegenereerd met bijvoorbeeld de PHP bibliotheek DOMPDF en gebruikmakend van de ContacForm7 hook 'wpcf7_before_send_mail':

add_action('wpcf7_before_send_mail', 'ggsc_preprocess_mail',5);
function ggsc_preprocess_mail( $cf7 ) { 
  $cf7_id = get_option('ggsc_cf7_id');
  if ($cf7->id == $cf7_id){
    /*  
    * Laad de libraries
    */  
    require_once(__DIR__ . "/lib/dompdf/dompdf_config.inc.php");
    /*  
    * Haal het te gebruiken css bestand op die DOMPDF moet gebruiken om de PDF vorm te geven
    */  
    $css = file_get_contents('/volledig/pad/naar/css');
    /*  
    * Haal het veld op dat de informatie bevat die in de PDF moet worden geplaatst
    * Alle gegevens heb ik in de applicatie in een hidden formfield gekopieerd
    */  
    $post_id = get_option('ggsc_cf7_config_fieldname');
    $str = $_POST[$post_id];
    /*  
    * Filter escaped quotes en paden
    */  
    $str = str_replace('\"', '"',$str);
    $str = str_replace(WP_PLUGIN_URL, WP_PLUGIN_DIR,$str);
    /*  
    * Verwerk de overige formuliervelden (ik heb in de configuratie een selectie van te gebruiken velden opgenomen)
    */  
    $fields = explode(',',get_option('ggsc_cf7_pdffields'));
    if(is_array($fields)) {
      $str .= '<div class="klantgegevens"><h2>Request info</h2>';
      foreach($fields as $field) {
        $str .= '<p>' . $field . ' - ' . $_POST[$field] . '</p>';
    }   
      $str .= '</div>';
    }   
    /*  
    * Construeer nu de volledige HTML pagina en plaats de hierboven opgebouwde string en het CSS hierin
    */  
    $html = '<html>';
    $html .= '<head><style>'.$css.'</style></head>';
    $html .= '<body>' . $str . '</body></html>';
    /*  
    * Genereer de PDF 
    */  
    $dompdf = new DOMPDF();
    $dompdf->load_html($html);
    $dompdf->render();
    file_put_contents('/volledig/pad/naar/pdf', $dompdf->output());
  }
}

De PDF versturen als bijlage

Het met PDF document moet nu programmatisch als bijlage aan een e-mail worden toegevoegd.

De documentatie is over het algemeen erg summier en op fora tref je wel vragen aan maar zelden adequate antwoorden en de geopperde oplossingen zijn vaak verouderd. Dit is mede het gevolg van een aantal grote veranderingen die in de loop der ontwikkeling zijn doorgevoerd.

Zo werd in eerdere versies van CF7 het CF7 object "by refence" binnengehaald met de CF7 hook 'wpcf7_before_send_mail'. Dit object bevatte alle data die dan middels een callback functie makkelijk konden worden gemanipuleerd. Vanaf V3.9 is de "call by reference" verdwenen en werkt dat niet meer. Dat was echter alleen proefondervindelijk vast te stellen. Documentatie ontbrak of was erg summier.

Al zoekend vind je her en der verspreid over het internet allerlei informatie over hooks waarmee in het formulier kan worden ingegrepen maar nergens is er een systematisch overzicht te vinden van hooks en wat ze doen.

Na lang zoeken stuitte ik bij toeval op de hook 'wpcf7_mail_components'. Een pagina waarop werd uitgelegd hoe een PDF bestand aan de mail kan worden toegevoegd. Precies wat ik nodig had! Spread the word! En dat doe ik dus. Zo werkt het:

add_filter( 'wpcf7_mail_components', 'ggsc_wpcf7_mail_components' );
function ggsc_wpcf7_mail_components( $components ) {
  $components['attachments'][] = '/volledig/pad/naar/pdf;
  return $components;
}

 

Reactie toevoegen