WordPress.org

Ready to get started?Download WordPress

Forums

Contact Form DB
Creating Multiple Conditional E-mail Forms (5 posts)

  1. mattyk1972
    Member
    Posted 1 year ago #

    Hi Michael

    I hope you're well. I had a quick question that's linked to a problem you helped me solve a few months ago. I was looking to create a form that would be submitted to various different e-mails depending on the options the user had selected. I got the form set up and working great but I know need to create another form to do something similar on the same site.

    I've had a look at the page you created that explains how to add the required filter (http://cfdbplugin.com/?page_id=804) but I'm not sure how much of the filter code needs to be added for the second conditional e-mail form. Do I need to add all the filter code again for the new form, or just add the new form's details to the existing filter?

    Your help would be appreciated.

    Many thanks

    Matt

    http://wordpress.org/extend/plugins/contact-form-7-to-database-extension/

  2. Michael Simpson
    Member
    Plugin Author

    Posted 1 year ago #

    You could make a general PHP function with most of the code which you don't need to change, then make a smaller function for each form. Like this for "Form 1" and "Form 2":

    function location_form_handler($formData, $formName, $fieldName)
    {
        if ($formData && $formName == $formData->title && $formData->scanned_form_tags) {
            $emailSelected = $formData->posted_data[$fieldName];
            $valueSelected = null;
            foreach ($formData->scanned_form_tags as $tag) {
                if ($tag['name'] == $fieldName) {
                    foreach ($tag['raw_values'] as $rawValue) {
                        // value|email
                        $valuesArray = explode('|', $rawValue);
                        if (count($valuesArray) == 2 && $valuesArray[1] == $emailSelected) {
                            $valueSelected = $valuesArray[0];
                            break;
                        }
                    }
                }
                if ($valueSelected != null) {
                    break;
                }
            }
            if ($valueSelected != null) {
                $formData->posted_data[$fieldName] = $valueSelected;
                $formData->posted_data[$fieldName . '_email'] = $emailSelected;
            }
        }
        return $formData;
    }
    
    // Form 1
    function location_form_handler_form1($formData) {
        $formName = 'Form 1'; // change this to your form's name
        $fieldName = 'location'; // change this to your field's name
        location_form_handler($formData, $formName, $fieldName);
    }
    add_filter('cfdb_form_data', 'location_form_handler_form1');
    
    // Form 2
    function location_form_handler_form2($formData) {
        $formName = 'Form 2'; // change this to your form's name
        $fieldName = 'location'; // change this to your field's name
        location_form_handler($formData, $formName, $fieldName);
    }
    add_filter('cfdb_form_data', 'location_form_handler_form2');
  3. mattyk1972
    Member
    Posted 1 year ago #

    Hi Michael

    Thanks for getting back to me so quickly. I tried the code you provided but for some reason it's still not giving the results we're looking for. We're just getting the e-mail address we've added after the pipes instead of the field value.

    I tried changing the existing code we had for the original conditional e-mail form, and adding in the values of the new, second form, and that seemed to work fine, so I don't think there's an issue with the new form itself. I've attached the original code I was using which seems to be working fine (for either conditional e-mail form):

    function location_form_handler($formData)
    {
        $formName = 'Brochure Request Form'; // change this to your form's name
        $fieldName = 'country'; // change this to your field's name
        if ($formData && $formName == $formData->title && $formData->scanned_form_tags) {
            $emailSelected = $formData->posted_data[$fieldName];
            $valueSelected = null;
            foreach ($formData->scanned_form_tags as $tag) {
                if ($tag['name'] == $fieldName) {
                    foreach ($tag['raw_values'] as $rawValue) {
                        // value|email
                        $valuesArray = explode('|', $rawValue);
                        if (count($valuesArray) == 2 && $valuesArray[1] == $emailSelected) {
                            $valueSelected = $valuesArray[0];
                            break;
                        }
                    }
                }
                if ($valueSelected != null) {
                    break;
                }
            }
            if ($valueSelected != null) {
                $formData->posted_data[$fieldName] = $valueSelected;
                $formData->posted_data[$fieldName . '_email'] = $emailSelected;
            }
        }
        return $formData;
    }
    add_filter('cfdb_form_data', 'location_form_handler');

    And here is the new code I tried to add to replace it, I'm not sure if there's something in there that I've missed out but the field we used the pipes in always comes back as the e-mail address, rather the value the user selected. I even tried changing the field names so they were different n case that was an issue, but it still gave the same results.

    function location_form_handler($formData, $formName, $fieldName)
    {
        if ($formData && $formName == $formData->title && $formData->scanned_form_tags) {
            $emailSelected = $formData->posted_data[$fieldName];
            $valueSelected = null;
            foreach ($formData->scanned_form_tags as $tag) {
                if ($tag['name'] == $fieldName) {
                    foreach ($tag['raw_values'] as $rawValue) {
                        // value|email
                        $valuesArray = explode('|', $rawValue);
                        if (count($valuesArray) == 2 && $valuesArray[1] == $emailSelected) {
                            $valueSelected = $valuesArray[0];
                            break;
                        }
                    }
                }
                if ($valueSelected != null) {
                    break;
                }
            }
            if ($valueSelected != null) {
                $formData->posted_data[$fieldName] = $valueSelected;
                $formData->posted_data[$fieldName . '_email'] = $emailSelected;
            }
        }
        return $formData;
    }
    
    // Form 1
    function location_form_handler_form1($formData) {
        $formName = 'Brochure Request Form'; // change this to your form's name
        $fieldName = 'country'; // change this to your field's name
        location_form_handler($formData, $formName, $fieldName);
    }
    add_filter('cfdb_form_data', 'location_form_handler_form1');
    
    // Form 2
    function location_form_handler_form2($formData) {
        $formName = 'USA Booking Form'; // change this to your form's name
        $fieldName = 'country'; // change this to your field's name
        location_form_handler($formData, $formName, $fieldName);
    }
    add_filter('cfdb_form_data', 'location_form_handler_form2');

    Your patience and help is really appreciated.

    Thanks

    Matt

  4. Michael Simpson
    Member
    Plugin Author

    Posted 1 year ago #

    Sounds like the filter is not being called. You might try following the debug instruction on that web page. Put error_log statements in the location_form_handler1 and location_form_handler2 to make sure they are called.

  5. mattyk1972
    Member
    Posted 1 year ago #

    Hi Michael

    I've always struggled with the debugging process so I had another look at the code and seem to have got it to work by adding two bits of code - see below:

    function location_form_handler($formData)
    {
        $formName = 'Brochure Request Form'; // change this to your form's name
        $fieldName = 'country'; // change this to your field's name
        if ($formData && $formName == $formData->title && $formData->scanned_form_tags) {
            $emailSelected = $formData->posted_data[$fieldName];
            $valueSelected = null;
            foreach ($formData->scanned_form_tags as $tag) {
                if ($tag['name'] == $fieldName) {
                    foreach ($tag['raw_values'] as $rawValue) {
                        // value|email
                        $valuesArray = explode('|', $rawValue);
                        if (count($valuesArray) == 2 && $valuesArray[1] == $emailSelected) {
                            $valueSelected = $valuesArray[0];
                            break;
                        }
                    }
                }
                if ($valueSelected != null) {
                    break;
                }
            }
            if ($valueSelected != null) {
                $formData->posted_data[$fieldName] = $valueSelected;
                $formData->posted_data[$fieldName . '_email'] = $emailSelected;
            }
        }
        return $formData;
    }
    add_filter('cfdb_form_data', 'location_form_handler');
    
    function location_form_handler2($formData)
    {
        $formName = 'USA Booking Form'; // change this to your form's name
        $fieldName = 'country'; // change this to your field's name
        if ($formData && $formName == $formData->title && $formData->scanned_form_tags) {
            $emailSelected = $formData->posted_data[$fieldName];
            $valueSelected = null;
            foreach ($formData->scanned_form_tags as $tag) {
                if ($tag['name'] == $fieldName) {
                    foreach ($tag['raw_values'] as $rawValue) {
                        // value|email
                        $valuesArray = explode('|', $rawValue);
                        if (count($valuesArray) == 2 && $valuesArray[1] == $emailSelected) {
                            $valueSelected = $valuesArray[0];
                            break;
                        }
                    }
                }
                if ($valueSelected != null) {
                    break;
                }
            }
            if ($valueSelected != null) {
                $formData->posted_data[$fieldName] = $valueSelected;
                $formData->posted_data[$fieldName . '_email'] = $emailSelected;
            }
        }
        return $formData;
    }
    add_filter('cfdb_form_data', 'location_form_handler2');

    Thanks for all your help.

    Matt

Topic Closed

This topic has been closed to new replies.

About this Plugin

About this Topic