/**
  * Handle parsing multidimensional arrays of args.
  *
  * @author Jeremy Pry
  *
  * @param array $args     The arguments to parse.
  * @param array $defaults The defaults to combine with the regular arguments.
  *
  * @return array The parsed arguments.
  */
 function yikes_deep_parse_args($args, $defaults)
 {
     foreach ($args as $key => $value) {
         // If we don't have a corresponding default, just continue.
         if (!isset($defaults[$key])) {
             continue;
         }
         // For arrays, do another round of parsing args.
         if (is_array($value)) {
             $args[$key] = yikes_deep_parse_args($value, $defaults[$key]);
         }
     }
     // Now we're ready for the regular wp_parse_args() function
     return wp_parse_args($args, $defaults);
 }
 /**
  * Export our forms.
  *
  * @param string $file_name
  * @param array  $form_ids
  */
 public static function yikes_mailchimp_form_export($file_name, $form_ids)
 {
     $interface = yikes_easy_mailchimp_extender_get_form_interface();
     $form_ids = empty($form_ids) ? $interface->get_form_ids() : (array) $form_ids;
     $results = array();
     foreach ($form_ids as $form_id) {
         $results[$form_id] = $interface->get_form($form_id);
     }
     // Process report request
     $output_filename = $file_name . '-' . date('m-d-Y') . '.csv';
     $output_handle = @fopen('php://output', 'w');
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
     header('Content-Description: File Transfer');
     header('Content-type: text/csv');
     header('Content-Disposition: attachment; filename=' . $output_filename);
     header('Expires: 0');
     header('Pragma: public');
     // Export the titles using form defaults
     $defaults = $interface->get_form_defaults();
     ksort($defaults);
     $titles = array_keys($defaults);
     fputcsv($output_handle, $titles);
     // Parse results to csv format
     foreach ($results as $row) {
         // Ensure that we have all the data we're supposed to have.
         $row = array_intersect_key($row, $interface->get_form_defaults());
         $row = yikes_deep_parse_args($row, $interface->get_form_defaults());
         ksort($row);
         // Possibly convert arrays to JSON.
         foreach ($row as $key => &$value) {
             if (!is_array($value)) {
                 continue;
             }
             $value = json_encode($value);
         }
         // Add row to file
         fputcsv($output_handle, $row);
     }
     // Close output file stream
     fclose($output_handle);
     die;
 }
 /**
  * Create a new form.
  *
  * @author Jeremy Pry
  *
  * @param array $form_data Data to apply to the new form.
  *
  * @return int|bool The new form ID, or false on failure.
  */
 public function create_form($form_data)
 {
     // Include default form data
     $form_data = yikes_deep_parse_args($form_data, $this->get_form_defaults());
     // Grab our existing IDs and determine what the next one should be.
     $all_ids = $this->get_form_ids();
     $last_id = end($all_ids);
     $new_id = false === $last_id ? 1 : $last_id + 1;
     $form_data['id'] = $new_id;
     // Ensure our data is consistently sorted
     ksort($form_data);
     // Store the new form in our array of forms.
     $all_forms = $this->get_all_forms();
     $all_forms[$new_id] = $form_data;
     // Update our option with the new form.
     $result = update_option($this->option, $all_forms);
     if (false === $result) {
         return $result;
     }
     return $new_id;
 }
 /**
  * Create a new form.
  *
  * @author Jeremy Pry
  *
  * @param array $form_data Data to apply to the new form.
  *
  * @return int|bool The new form ID, or false on failure.
  */
 public function create_form($form_data)
 {
     // Include default form data
     $form_data = yikes_deep_parse_args($form_data, $this->get_form_defaults());
     // If there is an ID set, remove it
     unset($form_data['id']);
     // Prepare the data for the database
     $save_data = $this->prepare_data_for_db($form_data);
     $formats = $this->get_format_array($save_data);
     $result = $this->wpdb->insert($this->prefixed_table_name, $save_data, $formats);
     if (false === $result) {
         return $result;
     }
     return $this->wpdb->insert_id;
 }
 public function yikes_easy_mailchimp_update_form()
 {
     // grab & store our variables ( associated list & form name )
     $nonce = $_REQUEST['nonce'];
     $form_id = $_REQUEST['id'];
     // verify our nonce
     if (!wp_verify_nonce($nonce, 'update-mailchimp-form-' . $form_id)) {
         wp_die(__("We've run into an error. The security check didn't pass. Please try again.", 'yikes-inc-easy-mailchimp-extender'), __("Failed nonce validation", 'yikes-inc-easy-mailchimp-extender'), array('response' => 500, 'back_link' => true));
     }
     // store our values!
     $list_id = $_POST['associated-list'];
     $form_name = stripslashes($_POST['form-name']);
     $form_description = sanitize_text_field(stripslashes($_POST['form-description']));
     $send_welcome_email = $_POST['send-welcome-email'];
     $redirect_user_on_submit = $_POST['redirect-user-on-submission'];
     $redirect_page = $_POST['redirect-user-to-selection'];
     // stripslashes_deep on save, to prevent foreign languages from added excessive backslashes
     $assigned_fields = isset($_POST['field']) ? stripslashes_deep($_POST['field']) : array();
     // setup our submission settings serialized array
     $submission_settings = array('ajax' => $_POST['form-ajax-submission'], 'redirect_on_submission' => $_POST['redirect-user-on-submission'], 'redirect_page' => $_POST['redirect-user-to-selection'], 'custom_redirect_url' => esc_url($_POST['custom-redirect-url']), 'hide_form_post_signup' => $_POST['hide-form-post-signup'], 'replace_interests' => $_POST['replace-interest-groups']);
     // setup our opt-in settings serialized array
     $optin_settings = array('optin' => $_POST['single-double-optin'], 'update_existing_user' => $_POST['update-existing-user'], 'send_update_email' => $_POST['update-existing-email'], 'send_welcome_email' => $_POST['send-welcome-email']);
     // setup our error settings serialized array
     $error_settings = array('success' => trim($_POST['yikes-easy-mc-success-message']) ? trim(stripslashes($_POST['yikes-easy-mc-success-message'])) : '', 'general-error' => trim($_POST['yikes-easy-mc-general-error-message']) ? trim(stripslashes($_POST['yikes-easy-mc-general-error-message'])) : '', 'invalid-email' => trim($_POST['yikes-easy-mc-invalid-email-message']) ? trim(stripslashes($_POST['yikes-easy-mc-invalid-email-message'])) : '', 'already-subscribed' => trim($_POST['yikes-easy-mc-user-subscribed-message']) ? trim(stripslashes($_POST['yikes-easy-mc-user-subscribed-message'])) : '', 'update-link' => trim($_POST['yikes-easy-mc-user-update-link']) ? trim(stripslashes($_POST['yikes-easy-mc-user-update-link'])) : '');
     // Setup the new form settings array
     // @since 6.0.3.8
     // To Do: Combine date & time so it's a single unix timestamp
     $form_settings = array('yikes-easy-mc-form-class-names' => trim($_POST['yikes-easy-mc-form-class-names']), 'yikes-easy-mc-inline-form' => $_POST['yikes-easy-mc-inline-form'][0], 'yikes-easy-mc-submit-button-type' => $_POST['yikes-easy-mc-submit-button-type'][0], 'yikes-easy-mc-submit-button-text' => trim($_POST['yikes-easy-mc-submit-button-text']), 'yikes-easy-mc-submit-button-image' => esc_url(trim($_POST['yikes-easy-mc-submit-button-image'])), 'yikes-easy-mc-submit-button-classes' => trim($_POST['yikes-easy-mc-submit-button-classes']), 'yikes-easy-mc-form-schedule' => isset($_POST['yikes-easy-mc-form-schedule']) ? '1' : '0', 'yikes-easy-mc-form-restriction-start' => strtotime($_POST['yikes-easy-mc-form-restriction-start-date'] . ' ' . $_POST['yikes-easy-mc-form-restriction-start-time']), 'yikes-easy-mc-form-restriction-end' => strtotime($_POST['yikes-easy-mc-form-restriction-end-date'] . ' ' . $_POST['yikes-easy-mc-form-restriction-end-time']), 'yikes-easy-mc-form-restriction-pending-message' => trim($_POST['yikes-easy-mc-form-restriction-pending-message']), 'yikes-easy-mc-form-restriction-expired-message' => trim($_POST['yikes-easy-mc-form-restriction-expired-message']), 'yikes-easy-mc-form-login-required' => isset($_POST['yikes-easy-mc-form-login-required']) ? '1' : '0', 'yikes-easy-mc-form-restriction-login-message' => trim($_POST['yikes-easy-mc-form-restriction-login-message']));
     // additional custom fields (extensions / user defined fields)
     $custom_fields = array();
     if (isset($_POST['custom-field'])) {
         foreach ($_POST['custom-field'] as $custom_field => $custom_value) {
             if (is_array($custom_value)) {
                 $custom_fields[$custom_field] = array_filter(stripslashes_deep($custom_value));
                 // array_filters to remove empty items (don't save them!)
             } else {
                 $custom_fields[$custom_field] = stripslashes($custom_value);
             }
         }
     }
     $form_updates = yikes_deep_parse_args(array('list_id' => $list_id, 'form_name' => $form_name, 'form_description' => $form_description, 'fields' => $assigned_fields, 'custom_template' => 0, 'send_welcome_email' => $send_welcome_email, 'redirect_user_on_submit' => $redirect_user_on_submit, 'redirect_page' => $redirect_page, 'submission_settings' => $submission_settings, 'optin_settings' => $optin_settings, 'error_messages' => $error_settings, 'form_settings' => $form_settings, 'custom_fields' => $custom_fields), $this->form_interface->get_form_defaults());
     $this->form_interface->update_form($form_id, $form_updates);
     /* Custom action hook which allows users to update specific options when a form is updated - used in add ons */
     do_action('yikes-mailchimp-save-form', $form_id, $custom_fields);
     // redirect the user to the manage forms page, display confirmation
     wp_redirect(esc_url_raw(admin_url('admin.php?page=yikes-mailchimp-edit-form&id=' . $form_id . '&updated-form=true')));
     exit;
 }