<?php
namespace MetForm\Core\Forms;
defined('ABSPATH') || exit;
Class Action {
use \MetForm\Traits\Singleton;
private $key_form_settings;
private $key_option_settings;
private $key_form_count_views;
private $post_type;
private $fields;
private $form_id;
private $form_setting;
private $title;
private $response = [];
public function __construct() {
$this->key_form_settings = Base::instance()->form->get_key_form_settings();
$this->key_option_settings = 'metform_option__settings';
$this->key_form_count_views = 'metform_form__count_views';
$this->post_type = Base::instance()->form->get_name();
$this->response = [
'saved' => false,
'status' => esc_html("Something went wrong.", 'metform'),
'data' => [
],
];
}
public function store($form_id, $form_setting) {
$this->fields = $this->get_fields();
$this->sanitize($form_setting);
$this->form_id = $form_id;
if(isset($form_setting['mf_zapier']) && isset($form_setting['mf_zapier_webhook']) && $form_setting['mf_zapier_webhook'] != '') {
$map_data = \MetForm\Core\Entries\Action::instance()->get_fields($form_id);
$email_name = \MetForm\Core\Entries\Action::instance()->get_input_name_by_widget_type('mf-email', $map_data);
$existing_settings = \MetForm\Core\Forms\Action::instance()->get_all_data($this->form_id);
$zapier = new \MetForm_Pro\Core\Integrations\Zapier();
$url = $form_setting['mf_zapier_webhook'];
if(!empty($existing_settings) && ($existing_settings['mf_zapier_webhook'] != $form_setting['mf_zapier_webhook'])) {
$this->response['data']['zapier'] = $zapier->call_webhook($form_data[] = null, ['url' => $url, 'email_name' => $email_name]);
} elseif(empty($existing_settings)) {
$this->response['data']['zapier'] = $zapier->call_webhook($form_data[] = null, ['url' => $url, 'email_name' => $email_name]);
}
}
if($this->form_id == -1) {
$this->update_option_settings();
} else {
if($this->form_id == 0) {
$this->insert();
} else {
$this->update();
}
}
return $this->response;
}
public function update_option_settings() {
$status = update_option($this->key_option_settings, $this->form_setting);
if($status) {
$this->response['saved'] = true;
$this->response['status'] = esc_html__('Form settings inserted', 'metform');
$this->response['key'] = $this->key_option_settings;
$this->response['data'] = $this->form_setting;
}
}
public function insert() {
$this->title = ($this->form_setting['form_title'] != '') ? $this->form_setting['form_title'] : 'New Form # ' . time();
$defaults = [
'post_title' => $this->title,
'post_status' => 'publish',
'post_type' => $this->post_type,
];
$this->form_id = wp_insert_post($defaults);
update_post_meta($this->form_id, $this->key_form_settings, $this->form_setting);
update_post_meta($this->form_id, '_wp_page_template', 'elementor_canvas');
$this->response['saved'] = true;
$this->response['status'] = esc_html__('Form settings inserted', 'metform');
if((!array_key_exists('store_entries', $this->form_setting)) && (!array_key_exists('enable_user_notification', $this->form_setting)) && (!array_key_exists('enable_admin_notification', $this->form_setting)) && (!array_key_exists('mf_mail_chimp', $this->form_setting)) && (!array_key_exists('mf_zapier', $this->form_setting))) {
$this->response['saved'] = false;
$this->response['status'] = esc_html__('You must active at least one field of these fields "store entry/ Confirmation/ Notification/ MailChimp/ Zapier". ', 'metform');
}
if((array_key_exists('mf_paypal', $this->form_setting)) && (!array_key_exists('store_entries', $this->form_setting))) {
$this->response['saved'] = false;
$this->response['status'] = esc_html__('You must enable "store entries" for integrating payment method.', 'metform');
}
$this->response['data']['id'] = $this->form_id;
$this->response['data']['title'] = $this->title;
$this->response['data']['type'] = $this->post_type;
}
public function update() {
$this->title = ($this->form_setting['form_title'] != '') ? $this->form_setting['form_title'] : 'Form # ' . time();
if(isset($this->form_setting['form_title'])) {
$update_post = [
'ID' => $this->form_id,
'post_title' => $this->title,
];
wp_update_post($update_post);
}
update_post_meta($this->form_id, $this->key_form_settings, $this->form_setting);
update_post_meta($this->form_id, '_wp_page_template', 'elementor_canvas');
$this->response['saved'] = true;
$this->response['status'] = esc_html__('Form settings updated', 'metform');
if((!array_key_exists('store_entries', $this->form_setting)) && (!array_key_exists('enable_user_notification', $this->form_setting)) && (!array_key_exists('enable_admin_notification', $this->form_setting)) && (!array_key_exists('mf_mail_chimp', $this->form_setting)) && (!array_key_exists('mf_zapier', $this->form_setting)) && (!array_key_exists('mf_rest_api', $this->form_setting)) && (!array_key_exists('mf_slack', $this->form_setting))) {
$this->response['saved'] = false;
$this->response['status'] = esc_html__('You must active at least one field of these fields "store entries/ Confirmation/ Notification/ REST API/ MailChimp/ Slack/ Zapier". ', 'metform');
}
if((array_key_exists('mf_paypal', $this->form_setting)) && (!array_key_exists('store_entries', $this->form_setting))) {
$this->response['saved'] = false;
$this->response['status'] = esc_html__('You must enable "store entries" for integrating payment method.', 'metform');
}
$this->response['data']['id'] = $this->form_id;
$this->response['data']['title'] = $this->title;
$this->response['data']['type'] = $this->post_type;
}
public function get_fields() {
return Base::instance()->form->get_form_settings_fields();
}
public function sanitize($form_setting, $fields = null) {
if($fields == null) {
$fields = $this->fields;
}
foreach($form_setting as $key => $value) {
if(isset($fields[$key])) {
$this->form_setting[$key] = $value;
}
}
}
/**
*
* @param $post_id
*
* @return array|null
*/
public function get_all_data($post_id) {
// this hide all the response after form submission
// if(!current_user_can('manage_options')) {
// return;
// }
$post = get_post($post_id);
if(!is_object($post)) {
return null;
}
if(!property_exists($post, 'ID')) {
return null;
}
$settings = get_post_meta($post->ID, $this->key_form_settings, true);
$settings = (is_array($settings) ? $settings : []);
$settings['entry_title'] = (!isset($settings['entry_title']) ? 'Entry # [mf_id]' : $settings['entry_title']);
$global_settings = \MetForm\Core\Admin\Base::instance()->get_settings_option();
$global_settings = (is_array($global_settings) ? $global_settings : []);
$cKitCache = [];
$awbCache = [];
$mpCache = [];
if(class_exists('\MetForm_Pro\Core\Integrations\Convert_Kit')) {
$cKitCache = get_option(\MetForm_Pro\Core\Integrations\Convert_Kit::CKIT_FORMS_CACHE_KEY);
}
if(class_exists('\MetForm_Pro\Core\Integrations\Aweber')) {
$awbCache = get_option(\MetForm_Pro\Core\Integrations\Aweber::AWEBER_LISTS_CACHE_KEY);
}
if(class_exists('\MetForm_Pro\Core\Integrations\Mail_Poet')) {
$mpCache = get_option(\MetForm_Pro\Core\Integrations\Mail_Poet::MAIL_POET_LISTS_CACHE_KEY);
}
if(empty($global_settings)) {
$all_settings = $settings;
$all_settings['mf_recaptcha_version'] = 'recaptcha-v2';
} else {
$all_settings = array_merge($settings, $global_settings);
}
$all_settings['form_title'] = get_the_title($post_id);
$map_data = \MetForm\Core\Entries\Action::instance()->get_fields($post_id);
\MetForm\Core\Entries\Metform_Shortcode::instance()->set_all_keys($map_data);
$formated_keys = \MetForm\Core\Entries\Metform_Shortcode::instance()->get_all_keys();
$all_settings['input_names'] = (!empty($formated_keys) ? implode(' ', $formated_keys) : 'Example: [mf-inputname]');
$all_settings['ckit_opt'] = $cKitCache;
$all_settings['aweber_opt'] = $awbCache;
$all_settings['mp_opt'] = $mpCache;
// Attach hubspot form fields settings with the form settings
$hubspot_settings = get_option( 'mf_hubspot_form_data_' . $post_id );
if(!empty($hubspot_settings)){
foreach($hubspot_settings as $hubspot_setting){
if(is_array($hubspot_setting)){
foreach($hubspot_setting as $kay => $value){
$all_settings[$kay] = $value;
}
}
}
}
// Attach Aweber custom fields settings with the form settings
$aweber_custom_field_settings = get_option( 'mf_aweber_form_data_' . $post_id );
if(!empty($aweber_custom_field_settings)){
foreach($aweber_custom_field_settings as $aweber_field_setting){
if(is_array($aweber_field_setting)){
foreach($aweber_field_setting as $kay => $value){
$all_settings[$kay] = $value;
}
}
}
}
$mf_redirect_params_status = get_post_meta($post_id, 'mf_redirect_params_status', true);
$mf_url_params_data = get_post_meta($post_id, 'mf_redirect_params', true);
if($mf_url_params_data && $mf_redirect_params_status){
$mf_url_params_data = json_decode($mf_url_params_data);
array_push($all_settings, ['mf_redirect_params'=>$mf_url_params_data]);
$all_settings['mf_redirect_params'] = $mf_url_params_data;
}
$all_settings['mf_redirect_params_status'] = $mf_redirect_params_status;
return $all_settings;
}
public function get_count_views($form_id) {
return get_post_meta($form_id, $this->key_form_count_views, true);
}
public function count_views($form_id) {
$form_setting = $this->get_all_data($form_id);
//return $form_setting;
if(isset($form_setting['count_views']) && $form_setting['count_views'] == '1') {
$count = $this->get_count_views($form_id);
$count = (int)$count;
$count++;
update_post_meta($form_id, $this->key_form_count_views, $count);
return $count;
}
}
}