<?php
namespace MetForm\Utils;
defined( 'ABSPATH' ) || exit;
/**
* Global helper class.
*
* @since 1.0.0
*/
class Util{
public static $instance = null;
private static $key = 'metform_options';
public static function get_option( $key, $default = '' ) {
$data_all = get_option( self::$key );
return ( isset( $data_all[ $key ] ) && $data_all[ $key ] != '' ) ? $data_all[ $key ] : $default;
}
public static function save_option( $key, $value = '' ) {
$data_all = get_option( self::$key );
$data_all[ $key ] = $value;
return update_option( self::$key, $data_all );
}
public static function get_settings( $key, $default = '' ) {
$data_all = self::get_option( 'settings', array() );
return ( isset( $data_all[ $key ] ) && $data_all[ $key ] != '' ) ? $data_all[ $key ] : $default;
}
public static function save_settings( $new_data = '' ) {
$data_old = self::get_option( 'settings', array() );
$data = array_merge( $data_old, $new_data );
return self::save_option( 'settings', $data );
}
public static function metform_admin_action() {
// Check for nonce security
$status = '';
if (!isset($_POST['nonce']) || ! wp_verify_nonce( sanitize_key(wp_unslash($_POST['nonce'])), 'ajax-nonce' ) ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
if ( isset( $_POST['settings'] ) ) {
$status = self::save_settings( empty( $_POST['settings'] ) ? array() : map_deep( wp_unslash( $_POST['settings'] ) , 'sanitize_text_field' ) );
}
if($status){
wp_send_json_success();
}else{
wp_send_json_error();
}
exit;
}
public static function instance() {
if ( is_null( self::$instance ) ) {
// Fire the class instance
self::$instance = new self();
}
return self::$instance;
}
/**
* Support For HTML Entities
*
* @since 1.3.1
* @access public
*/
public static function react_entity_support($str, $render_on_editor) {
if ( !\Elementor\Plugin::$instance->editor->is_edit_mode() || $render_on_editor ):
$str = '${ parent.decodeEntities(`'. $str .'`) } ';
endif;
return $str;
}
/**
* Get metform older version if has any.
*
* @since 1.0.0
* @access public
*/
public static function old_version(){
$version = get_option('metform_version');
return null == $version ? -1 : $version;
}
/**
* Set metform installed version as current version.
*
* @since 1.0.0
* @access public
*/
public static function set_version(){
}
/**
* Auto generate classname from path.
*
* @since 1.0.0
* @access public
*/
public static function make_classname( $dirname ) {
$dirname = pathinfo($dirname, PATHINFO_FILENAME);
$class_name = explode( '-', $dirname );
$class_name = array_map( 'ucfirst', $class_name );
$class_name = implode( '_', $class_name );
return $class_name;
}
public static function google_fonts($font_families = []) {
$fonts_url = '';
if ( $font_families ) {
$query_args = array(
'family' => urlencode( implode( '|', $font_families ) )
);
$fonts_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' );
}
return esc_url_raw( $fonts_url );
}
public static function kses( $raw ) {
$allowed_tags = array(
'a' => array(
'class' => array(),
'href' => array(),
'rel' => array(),
'title' => array(),
'target' => array(),
),
'abbr' => array(
'title' => array(),
),
'b' => array(),
'blockquote' => array(
'cite' => array(),
),
'cite' => array(
'title' => array(),
),
'code' => array(),
'del' => array(
'datetime' => array(),
'title' => array(),
),
'dd' => array(),
'div' => array(
'class' => array(),
'title' => array(),
'style' => array(),
),
'dl' => array(),
'dt' => array(),
'em' => array(),
'h1' => array(
'class' => array(),
),
'h2' => array(
'class' => array(),
),
'h3' => array(
'class' => array(),
),
'h4' => array(
'class' => array(),
),
'h5' => array(
'class' => array(),
),
'h6' => array(
'class' => array(),
),
'i' => array(
'class' => array(),
),
'img' => array(
'alt' => array(),
'class' => array(),
'height' => array(),
'src' => array(),
'width' => array(),
),
'li' => array(
'class' => array(),
),
'ol' => array(
'class' => array(),
),
'p' => array(
'class' => array(),
),
'q' => array(
'cite' => array(),
'title' => array(),
),
'span' => array(
'class' => array(),
'title' => array(),
'style' => array(),
),
'iframe' => array(
'width' => array(),
'height' => array(),
'scrolling' => array(),
'frameborder' => array(),
'allow' => array(),
'src' => array(),
),
'strike' => array(),
'br' => array(),
'strong' => array(),
'data-wow-duration' => array(),
'data-wow-delay' => array(),
'data-wallpaper-options' => array(),
'data-stellar-background-ratio' => array(),
'ul' => array(
'class' => array(),
),
);
if ( function_exists( 'wp_kses' ) ) { // WP is here
return wp_kses( $raw, $allowed_tags );
} else {
return $raw;
}
}
public static function get_kses_array( ) {
$allowed_tags = array(
'a' => array(
'class' => array(),
'href' => array(),
'rel' => array(),
'title' => array(),
'target' => array(),
),
'abbr' => array(
'title' => array(),
),
'b' => array(),
'blockquote' => array(
'cite' => array(),
),
'cite' => array(
'title' => array(),
),
'code' => array(),
'del' => array(
'datetime' => array(),
'title' => array(),
),
'dd' => array(),
'div' => array(
'class' => array(),
'title' => array(),
'style' => array(),
),
'dl' => array(),
'dt' => array(),
'em' => array(),
'h1' => array(
'class' => array(),
),
'h2' => array(
'class' => array(),
),
'h3' => array(
'class' => array(),
),
'h4' => array(
'class' => array(),
),
'h5' => array(
'class' => array(),
),
'h6' => array(
'class' => array(),
),
'i' => array(
'class' => array(),
),
'img' => array(
'alt' => array(),
'class' => array(),
'height' => array(),
'src' => array(),
'width' => array(),
),
'li' => array(
'class' => array(),
),
'ol' => array(
'class' => array(),
),
'p' => array(
'class' => array(),
),
'q' => array(
'cite' => array(),
'title' => array(),
),
'span' => array(
'class' => array(),
'title' => array(),
'style' => array(),
),
'iframe' => array(
'width' => array(),
'height' => array(),
'scrolling' => array(),
'frameborder' => array(),
'allow' => array(),
'src' => array(),
),
'strike' => array(),
'br' => array(),
'strong' => array(),
'data-wow-duration' => array(),
'data-wow-delay' => array(),
'data-wallpaper-options' => array(),
'data-stellar-background-ratio' => array(),
'ul' => array(
'class' => array(),
),
);
return $allowed_tags;
}
public static function kspan($text){
return str_replace(['{', '}'], ['<span>', '</span>'], self::kses($text));
}
public static function trim_words($text, $num_words){
return wp_trim_words( $text, $num_words, '' );
}
public static function array_push_assoc($array, $key, $value){
$array[$key] = $value;
return $array;
}
public static function render($content){
if (stripos($content, "metform-has-lisence") !== false) {
return null;
}
return $content;
}
public static function render_elementor_content($content_id){
$elementor_instance = \Elementor\Plugin::instance();
return $elementor_instance->frontend->get_builder_content_for_display( $content_id );
}
public static function img_meta($id){
$attachment = get_post($id);
if($attachment == null || $attachment->post_type != 'attachment'){
return null;
}
return [
'alt' => get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ),
'caption' => $attachment->post_excerpt,
'description' => $attachment->post_content,
'href' => get_permalink( $attachment->ID ),
'src' => $attachment->guid,
'title' => $attachment->post_title
];
}
public static function render_inner_content($content, $id){
return str_replace('.elementor-'.$id.' ', '#elementor .elementor-'.$id.' ', $content);
}
public static function mfConvertStyleToReactObj($content){
preg_match_all(' /style=("|\')(.*?)("|\')/', $content, $match);
if(isset($match) && !empty($match ) && count($match) <= 0) { return $content; }
$exception_styled_property_names = [
'--divider-pattern-url'
];
foreach ($match[2] as $item) {
$styleData = [];
$is_matched_found = false;
foreach($exception_styled_property_names as $property_name){
if (strpos($item, $property_name) !== FALSE) {
if($property_name === '--divider-pattern-url'){
$is_matched_found = true;
$styleData['--divider-pattern-url'] = rtrim(trim(str_replace('--divider-pattern-url:', '', html_entity_decode($item, ENT_QUOTES))), ';');
}
}
}
if(!$is_matched_found){
$styles = explode(';', $item);
if(isset($styles) && !empty($styles )){
foreach($styles as $style){
$split = explode(':', $style);
$key = isset($split[0]) ? trim($split[0]) : '';
$value = isset($split[1]) ? trim($split[1]) : '';
if(strlen($key) > 0 && strlen($value)){
$styleData["$key"] = $value;
}
}
}
}
$newStyledData = '';
if(!empty($styleData)){
$newStyledData .= "{ ";
foreach($styleData as $key => $value){
$value = addslashes($value);
$newStyledData .= "'$key': '{$value}',";
}
$newStyledData .= " }";
}
//* Replace the old style with new style that capable of react
$replaceStyle = (isset($newStyledData) && !empty($newStyledData )) ? 'style=${' . $newStyledData . '}' : '';
$content = preg_replace(array('[style=("|\')('. preg_quote($item) .')("|\')]'), $replaceStyle, $content);
}
$modified = str_replace('<style>','<style key="1">',$content);
return str_replace('data-elementor-type="wp-post"','data-elementor-type="wp-post" key="2"',$modified);
}
public static function render_form_content($form, $widget_id){
$rest_url = get_rest_url();
$form_unique_name = (is_numeric($form)) ? ($widget_id.'-'.$form) : $widget_id;
$form_id = (is_numeric($form)) ? $form : $widget_id;
$form_settings = \MetForm\Core\Forms\Action::instance()->get_all_data($form_id);
$site_key = !empty($form_settings['mf_recaptcha_site_key']) ? $form_settings['mf_recaptcha_site_key'] : '';
$form_type = isset($form_settings['form_type']) ? $form_settings['form_type'] : 'contact_form';
if(!empty($form_settings['mf_recaptcha_version'])) {
if($form_settings['mf_recaptcha_version'] == 'recaptcha-v3') {
$site_key = $form_settings['mf_recaptcha_site_key_v3'];
}
}
ob_start();
?>
<div
id="metform-wrap-<?php echo esc_attr( $form_unique_name ); ?>"
class="mf-form-wrapper"
data-form-id="<?php echo esc_attr( $form_id ); ?>"
data-action="<?php echo esc_attr($rest_url. "metform/v1/entries/insert/" .$form_id); ?>"
data-wp-nonce="<?php echo esc_attr(wp_create_nonce( 'wp_rest' )); ?>"
data-form-nonce="<?php echo esc_attr(wp_create_nonce( 'form_nonce' )); ?>"
data-quiz-summery = "<?php echo (!empty($form_settings['quiz_summery']) && class_exists('\MetForm_Pro\Base\Package')) ? "true" : "false"; ?>"
data-save-progress = "<?php echo (isset($form_settings['mf_save_progress']) && $form_settings['mf_save_progress'] && class_exists('\MetForm_Pro\Base\Package')) ? "true" : "false"; ?>"
data-form-type="<?php echo esc_attr($form_type); ?>"
data-stop-vertical-effect="<?php echo esc_attr(isset($form_settings['mf_stop_vertical_scrolling']) ? $form_settings['mf_stop_vertical_scrolling'] : '') ?>"
></div>
<!-----------------------------
* controls_data : find the the props passed indie of data attribute
* props.SubmitResponseMarkup : contains the markup of error or success message
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
--------------------------- -->
<?php $is_edit_mode = \Elementor\Plugin::$instance->editor->is_edit_mode(); ?>
<script type="text/mf" class="mf-template">
function controls_data (value){
let currentWrapper = "mf-response-props-id-<?php echo esc_attr( $form_id ); ?>";
let currentEl = document.getElementById(currentWrapper);
return currentEl ? currentEl.dataset[value] : false
}
let is_edit_mode = '<?php echo esc_attr( $is_edit_mode );?>' ? true : false;
let message_position = controls_data('messageposition') || 'top';
let message_successIcon = controls_data('successicon') || '';
let message_errorIcon = controls_data('erroricon') || '';
let message_editSwitch = controls_data('editswitchopen') === 'yes' ? true : false;
let message_proClass = controls_data('editswitchopen') === 'yes' ? 'mf_pro_activated' : '';
let is_dummy_markup = is_edit_mode && message_editSwitch ? true : false;
return html`
<form
className="metform-form-content"
ref=${parent.formContainerRef}
onSubmit=${ validation.handleSubmit( parent.handleFormSubmit ) }
>
${is_dummy_markup ? message_position === 'top' ? props.ResponseDummyMarkup(message_successIcon, message_proClass) : '' : ''}
${is_dummy_markup ? ' ' : message_position === 'top' ? props.SubmitResponseMarkup`${parent}${state}${message_successIcon}${message_errorIcon}${message_proClass}` : ''}
<!--------------------------------------------------------
*** IMPORTANT / DANGEROUS ***
${html``} must be used as in immediate child of "metform-form-main-wrapper"
class otherwise multistep form will not run at all
---------------------------------------------------------->
<div className="metform-form-main-wrapper" key=${'hide-form-after-submit'} ref=${parent.formRef}>
${html`
<?php
$replaceStrings = array(
'from' => array(
'class=',
'for=',
'cellspacing=',
'cellpadding=',
'srcset',
'colspan',
'<script>', // Script Start Tag
'</script>', // Script End Tag
'<br>',
'<BR>'
),
'to' => array(
'className=',
'htmlFor=',
'cellSpacing=',
'cellPadding=',
'srcSet',
'colSpan',
'${(function(){', // Script Start Tag
'})()}', // Script End Tag
'<br/>',
'<br/>'
),
);
$form_content = is_numeric( $form ) ? \MetForm\Utils\Util::render_elementor_content( $form ) : $form;
$form_content = \MetForm\Utils\Util::mfConvertStyleToReactObj($form_content);
$form_content = str_replace( $replaceStrings['from'], $replaceStrings['to'], $form_content );
$form_content = preg_replace( '/<!--(.|\s)*?-->/', '', $form_content ); // Removes HTML Comments
echo $form_content; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- ignore this because of if escape this content does not append in preview and frontend.
?>
`}
</div>
${is_dummy_markup ? message_position === 'bottom' ? props.ResponseDummyMarkup(message_successIcon, message_proClass) : '' : ''}
${is_dummy_markup ? ' ' : message_position === 'bottom' ? props.SubmitResponseMarkup`${parent}${state}${message_successIcon}${message_errorIcon}${message_proClass}` : ''}
</form>
`
</script>
<?php
$output = ob_get_contents();
ob_end_clean();
return $output;
}
public static function add_param_url($url, $key, $value) {
$url = preg_replace('/(.*)(?|&)'. $key .'=[^&]+?(&)(.*)/i', '$1$2$4', $url .'&');
$url = substr($url, 0, -1);
if (strpos($url, '?') === false) {
return ($url .'?'. $key .'='. $value);
} else {
return ($url .'&'. $key .'='. $value);
}
}
public static function get_form_settings($key){
$options = get_option('metform_option__settings');
return isset($options[$key]) ? $options[$key] : '';
}
public static function metform_content_renderer($content){
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo $content;
}
/**
* Convert a abs path to a URL.
*
* @since 3.2.0
* @access public
*/
public static function abs_path_to_url( $path = '' ) {
$url = str_replace(
wp_normalize_path( untrailingslashit( ABSPATH ) ),
site_url(),
wp_normalize_path( $path )
);
return esc_url_raw( $url );
}
public static function permalink_setup(){
if( current_user_can('manage_options') ) {
if(isset($_GET['permalink']) && $_GET['permalink'] == 'post' && isset($_GET['_wpnonce']) && wp_verify_nonce(sanitize_text_field(wp_unslash($_GET['_wpnonce'])))){
self::change_permalink();
}
if(get_option('rewrite_rules') =='' && !isset($_GET['permalink'])){
$message = sprintf(esc_html__('Plain permalink is not supported with MetForm. We recommend to use post name as your permalink settings.', 'metform'));
\Oxaim\Libs\Notice::instance('metform', 'unsupported-permalink')
->set_type('warning')
->set_message($message)
->set_button([
'url' => wp_nonce_url(self_admin_url('options-permalink.php?permalink=post')),
'text' => esc_html__('Change Permalink','metform'),
'class' => 'button-primary',
])
->call();
}
}
}
public static function change_permalink(){
global $wp_rewrite;
$wp_rewrite->set_permalink_structure('/%postname%/');
//Set the option
update_option( "rewrite_rules", false );
//Flush the rules and tell it to write htaccess
$wp_rewrite->flush_rules( true );
add_action('admin_notices', array( self::class, 'permalink_structure_update_notice'));
}
public static function permalink_structure_update_notice() {
if ( !current_user_can('manage_options') ) {
return;
}
?>
<div class="notice notice-success is-dismissible">
<p><b><?php esc_html_e( 'Permalink Structure Updated!', 'metform' ); ?></b></p>
</div>
<?php
}
public static function banner_consent(){
include_once "user-consent-banner/consent-check-view.php";
}
}