web/wp-content/plugins/acf-extended/includes/modules/form/module-form-action-email.php (633 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } if(!class_exists('acfe_module_form_action_email')): class acfe_module_form_action_email extends acfe_module_form_action{ /** * initialize */ function initialize(){ $this->name = 'email'; $this->title = __('Email action', 'acfe'); $this->item = array( 'action' => 'email', 'name' => '', 'email' => array( 'from' => '', 'to' => '', 'reply_to' => '', 'cc' => '', 'bcc' => '', 'subject' => '', 'content' => '', 'html' => false, ), 'attachments' => array( ), ); } /** * prepare_action * * acfe/form/prepare_post:9 * * @param $action * @param $form * * @return array */ function prepare_action($action, $form){ return $action; } /** * make_action * * acfe/form/make_email:9 * * @param $form * @param $action */ function make_action($form, $action){ // send email $args = $this->process($form, $action); if(!$args){ return; } // output $this->generate_output($args, $form, $action); // hooks do_action("acfe/form/submit_email", $args, $form, $action); do_action("acfe/form/submit_email/form={$form['name']}", $args, $form, $action); do_action("acfe/form/submit_email/action={$action['name']}", $args, $form, $action); } /** * process * * @param $form * @param $action * * @return false */ function process($form, $action){ // tags context acfe_add_context(array('context' => 'display')); // apply tags acfe_apply_tags($action['email']['from']); acfe_apply_tags($action['email']['to']); acfe_apply_tags($action['email']['reply_to']); acfe_apply_tags($action['email']['cc']); acfe_apply_tags($action['email']['bcc']); acfe_apply_tags($action['email']['subject']); acfe_apply_tags($action['email']['content'], array('unformat' => 'wysiwyg')); acfe_delete_context(array('context')); // html: apply shortcodes if($action['email']['html']){ $action['email']['content'] = do_shortcode($action['email']['content']); // wysiwyg: apply the_content filters (autop, shortcode, etc.) }else{ $action['email']['content'] = apply_filters('acf_the_content', $action['email']['content']); } // args $args = $action['email']; // headers $args['headers'] = $this->get_headers($action); // attachments $attachments = $this->get_attachments($action); $args['attachments'] = $attachments['attachments']; $args['delete_files'] = $attachments['delete_files']; // filters $args = apply_filters("acfe/form/submit_email_args", $args, $form, $action); $args = apply_filters("acfe/form/submit_email_args/form={$form['name']}", $args, $form, $action); $args = apply_filters("acfe/form/submit_email_args/action={$action['name']}", $args, $form, $action); // bail early if($args === false){ return false; } // attachements/delete_files might have been deleted by filters // reset to empty array if not set if(!isset($args['attachments']) || empty($args['attachments'])){ $args['attachments'] = array(); } if(!isset($args['delete_files']) || empty($args['delete_files'])){ $args['delete_files'] = array(); } // check arguments change after filters // re-construct headers with new arguments if needed $args = $this->validate_headers($args, $action); // send email wp_mail($args['to'], $args['subject'], $args['content'], $args['headers'], $args['attachments']); // delete files foreach($args['delete_files'] as $file_id){ wp_delete_attachment($file_id, true); } return $args; } /** * get_headers * * @param $action * * @return array */ function get_headers($action){ // fields $fields = array( array('name' => 'From', 'value' => $action['email']['from']), array('name' => 'Reply-To', 'value' => $action['email']['reply_to']), array('name' => 'Cc', 'value' => $action['email']['cc']), array('name' => 'Bcc', 'value' => $action['email']['bcc']), array('name' => 'Content-Type', 'value' => 'text/html'), ); // headers $headers = array(); // construct headers foreach($fields as $field){ // From: email@domain.com if(!empty($field['value'])){ $headers[] = "{$field['name']}: {$field['value']}"; } } // return return $headers; } /** * get_attachments * * @param $action * * @return array[] */ function get_attachments($action){ // attachments $attachments = array(); $delete_files = array(); /** * $action[attachments] => Array( * [0] => Array( * [file] => {field:field_626202af1fbcd} * [delete] => true * ) * [1] => 36, * [2] => 52, * ) */ // construct attachments foreach($action['attachments'] as $row){ // files if(is_array($row)){ // vars $file_id = $row['file']; $delete = $row['delete']; // files $file_id = acfe_parse_tags($file_id, array('context' => 'save', 'format' => false, 'return' => 'raw')); // parse tags (unformatted + raw) $files = acf_get_array($file_id); // deprecated // just in case someone pass a file array in filters if(isset($files['ID'])){ $files = array($files); } foreach($files as $file){ $attachment_id = false; $attachment_path = false; // numeric if(is_numeric($file)){ $attachment_id = $file; $attachment_path = get_attached_file($file); // array }elseif(is_array($file) && isset($file['ID'])){ $attachment_id = $file['ID']; $attachment_path = get_attached_file($file['ID']); // url }else{ // retrieve url from path/url $path = acfe_locate_file_url($file); $attachment_id = attachment_url_to_postid($path); if($attachment_id){ $attachment_path = get_attached_file($attachment_id); } } // add to attachments array if($attachment_id && $attachment_path){ $attachments[] = $attachment_path; if($delete){ $delete_files[] = $attachment_id; } } } // static files }else{ $attachment_path = false; // numeric if(is_numeric($row)){ $attachment_path = get_attached_file($row); // url }else{ // retrieve url from path/url $path = acfe_locate_file_url($row); $attachment_id = attachment_url_to_postid($path); if($attachment_id){ $attachment_path = get_attached_file($attachment_id); } } // add to attachments array if($attachment_path){ $attachments[] = $attachment_path; } } } return array( 'attachments' => $attachments, 'delete_files' => $delete_files, ); } /** * validate_headers * * @param $args * @param $action */ function validate_headers($args, $action){ // fields $fields = array( 'from' => 'From:', 'reply_to' => 'Reply-To:', 'cc' => 'Cc:', 'bcc' => 'Bcc:', ); // loop fields foreach($fields as $slug => $label){ // vars $action_value = $action['email'][ $slug ]; // get $action['email']['from'] $args_value = acf_maybe_get($args, $slug); // get $args['from'] // check args value changed compared to action value if($args_value && $args_value !== $action_value){ // loop $args['headers'] foreach(array_keys($args['headers']) as $i){ // headers row starts with "From:..." if(acfe_starts_with($args['headers'][ $i ], $label)){ $args['headers'][ $i ] = "{$label} {$args_value}"; break; } } } } return $args; } /** * generate_output * * @param $args * @param $form * @param $action */ function generate_output($args, $form, $action){ // filters $args = apply_filters("acfe/form/submit_email_output", $args, $form, $action); $args = apply_filters("acfe/form/submit_email_output/form={$form['name']}", $args, $form, $action); $args = apply_filters("acfe/form/submit_email_output/action={$action['name']}", $args, $form, $action); // action output $this->set_action_output($args, $action); } /** * prepare_load_action * * acfe/module/prepare_load_action * * @param $action * * @return array */ function prepare_load_action($action){ // email loop foreach(array_keys($action['email']) as $k){ $action["email_{$k}"] = $action['email'][ $k ]; } // save: target $value = $action['email']['content']; if($action['email']['html']){ $action['email_content_group']['email_content_type'] = 'html'; $action['email_content_group']['email_content_html'] = $value; }else{ $action['email_content_group']['email_content_type'] = 'editor'; $action['email_content_group']['email_content_editor'] = $value; } // clone var $attachments = $action['attachments']; // reset $action['files'] = array(); $action['files_static'] = array(); foreach($attachments as $row){ // string (files_static) if(!is_array($row)){ $action['files_static'][] = array('file_static' => $row); //array (files) }else{ $action['files'][] = array( 'files_file' => $row['file'], 'files_delete' => $row['delete'], ); } } return $action; } /** * prepare_save_action * * acfe/module/prepare_save_action * * @param $action * @param $item * * @return mixed */ function prepare_save_action($action){ $save = $this->item; // general $save['name'] = $action['name']; // email loop foreach(array_keys($save['email']) as $k){ // from => email_from if(acf_maybe_get($action, "email_{$k}")){ $save['email'][ $k ] = $action["email_{$k}"]; } } // content group $group = $action['email_content_group']; // content type: editor if($group['content_type'] === 'editor'){ $save['email']['content'] = $group['content_editor']; // content type: html }elseif($group['content_type'] === 'html'){ $save['email']['content'] = $group['content_html']; $save['email']['html'] = true; } // files $action['files'] = acf_get_array($action['files']); $action['files_static'] = acf_get_array($action['files_static']); foreach($action['files'] as $row){ $save['attachments'][] = $row; } foreach($action['files_static'] as $row){ $save['attachments'][] = $row['file']; } return $save; } /** * register_layout * * @param $layout * * @return array */ function register_layout($layout){ return array( /** * documentation */ array( 'key' => 'field_doc', 'label' => '', 'name' => '', 'type' => 'acfe_dynamic_render', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'render' => function(){ echo '<a href="https://www.acf-extended.com/features/modules/dynamic-forms/e-mail-action" target="_blank">' . __('Documentation', 'acfe') . '</a>'; } ), /** * action */ array( 'key' => 'field_tab_action', 'label' => __('Action', 'acfe'), 'name' => '', 'type' => 'tab', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', 'data-no-preference' => true, ), 'placement' => 'top', 'endpoint' => 0, ), array( 'key' => 'field_name', 'label' => __('Action name', 'acfe'), 'name' => 'name', 'type' => 'acfe_slug', 'instructions' => __('(Optional) Target this action using hooks.', 'acfe'), 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', 'data-instruction-placement' => 'field' ), 'default_value' => '', 'placeholder' => __('Email', 'acfe'), 'prepend' => '', 'append' => '', 'maxlength' => '', ), /** * email */ array( 'key' => 'field_tab_email', 'label' => __('Email', 'acfe'), 'name' => '', 'type' => 'tab', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'placement' => 'top', 'endpoint' => 0, ), array( 'key' => 'field_email_from', 'label' => __('From', 'acfe'), 'name' => 'email_from', 'type' => 'text', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'placeholder' => __('Name <email@domain.com>', 'acfe'), 'prepend' => '', 'append' => '', 'maxlength' => '', ), array( 'key' => 'field_email_to', 'label' => __('To', 'acfe'), 'name' => 'email_to', 'type' => 'text', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'placeholder' => __('email@domain.com', 'acfe'), 'prepend' => '', 'append' => '', ), array( 'key' => 'field_email_reply_to', 'label' => __('Reply to', 'acfe'), 'name' => 'email_reply_to', 'type' => 'text', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'placeholder' => __('Name <email@domain.com>', 'acfe'), 'prepend' => '', 'append' => '', 'maxlength' => '', ), array( 'key' => 'field_email_cc', 'label' => __('Cc', 'acfe'), 'name' => 'email_cc', 'type' => 'text', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'placeholder' => __('email@domain.com', 'acfe'), 'prepend' => '', 'append' => '', 'maxlength' => '', ), array( 'key' => 'field_email_bcc', 'label' => __('Bcc', 'acfe'), 'name' => 'email_bcc', 'type' => 'text', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'placeholder' => __('email@domain.com', 'acfe'), 'prepend' => '', 'append' => '', 'maxlength' => '', ), array( 'key' => 'field_email_subject', 'label' => __('Subject', 'acfe'), 'name' => 'email_subject', 'type' => 'text', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'placeholder' => '', 'prepend' => '', 'append' => '', 'maxlength' => '', ), array( 'key' => 'field_email_content_group', 'label' => __('Content', 'acfe'), 'name' => 'email_content_group', 'type' => 'group', 'instructions' => __('Render customized email content.', 'acfe') . '<br /><br />' . __('Render all fields values:' ,'acfe') . '<br /><code>{fields}</code><br/><br/>' . __('Render field value:', 'acfe') . '<br /><code>{field:field_abc123}</code><br/><code>{field:my_field}</code>', 'required' => 0, 'conditional_logic' => array(), 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'layout' => 'block', 'acfe_seamless_style' => true, 'acfe_group_modal' => 0, 'sub_fields' => array( array( 'key' => 'field_email_content_type', 'label' => '', 'name' => 'content_type', 'type' => 'select', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'choices' => array( 'editor' => __('Content Editor', 'acfe'), 'html' => __('Raw HTML', 'acfe'), ), 'default_value' => array('custom'), 'allow_null' => 0, 'multiple' => 0, 'ui' => 0, 'return_format' => 'value', 'placeholder' => __('Default', 'acfe'), 'ajax' => 0, 'allow_custom' => 0, ), array( 'key' => 'field_email_content_editor', 'label' => '', 'name' => 'content_editor', 'type' => 'wysiwyg', 'instructions' => '', 'required' => 0, 'conditional_logic' => array( array( array( 'field' => 'field_email_content_type', 'operator' => '==', 'value' => 'editor', ), ), ), 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'tabs' => 'all', 'toolbar' => 'full', 'media_upload' => 1, 'delay' => 0, ), array( 'key' => 'field_email_content_html', 'label' => '', 'name' => 'content_html', 'type' => 'acfe_code_editor', 'instructions' => '', 'required' => 0, 'conditional_logic' => array( array( array( 'field' => 'field_email_content_type', 'operator' => '==', 'value' => 'html', ), ), ), 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'default_value' => '', 'rows' => 18, ), ), ), /** * attachments */ array( 'key' => 'field_tab_attachments', 'label' => __('Attachments', 'acfe'), 'name' => '', 'type' => 'tab', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'placement' => 'top', 'endpoint' => 0, ), array( 'key' => 'field_files', 'label' => __('Dynamic files', 'acfe'), 'name' => 'files', 'type' => 'repeater', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'collapsed' => '', 'min' => 0, 'max' => 0, 'layout' => 'table', 'button_label' => __('Add file', 'acfe'), 'sub_fields' => array( array( 'key' => 'field_files_file', 'label' => __('File', 'acfe'), 'name' => 'file', 'type' => 'select', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'choices' => array(), 'default_value' => array(), 'allow_null' => 0, 'multiple' => 0, 'ui' => 1, 'return_format' => 'value', 'ajax' => 1, 'placeholder' => '', 'search_placeholder' => __('Select a field or enter a custom value/template tag.', 'acfe'), 'allow_custom' => 1, 'ajax_action' => 'acfe/form/map_field_ajax', ), array( 'key' => 'field_files_delete', 'label' => __('Delete file', 'acfe'), 'name' => 'delete', 'type' => 'true_false', 'instructions' => '', 'required' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'message' => __('Delete file once sent', 'acfe'), 'default_value' => 0, 'ui' => 1, 'ui_on_text' => '', 'ui_off_text' => '', ), ), ), array( 'key' => 'field_files_static', 'label' => __('Static files', 'acfe'), 'name' => 'files_static', 'type' => 'repeater', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'collapsed' => '', 'min' => 0, 'max' => 0, 'layout' => 'table', 'button_label' => __('Add file', 'acfe'), 'sub_fields' => array( array( 'key' => 'field_file_static', 'label' => __('File', 'acfe'), 'name' => 'file', 'type' => 'file', 'instructions' => '', 'required' => 0, 'conditional_logic' => 0, 'wrapper' => array( 'width' => '', 'class' => '', 'id' => '', ), 'return_format' => 'id', ), ), ), ); } } acfe_register_form_action_type('acfe_module_form_action_email'); endif;