<?php
if ( ! defined( 'ABSPATH' ) ) {
die( '-1' );
}
require_once vc_path_dir( 'EDITORS_DIR', 'class-vc-edit-form-fields.php' );
/**
* Class Vc_ParamGroup_Edit_Form_Fields
* @since 4.4
*/
class Vc_ParamGroup_Edit_Form_Fields extends Vc_Edit_Form_Fields {
/** @noinspection PhpMissingParentConstructorInspection */
/**
* @param $settings
* @since 4.4
*
*/
public function __construct( $settings ) {
$this->setSettings( $settings );
}
/**
* Get shortcode attribute value wrapper for params group.
*
* This function checks if value isn't set then it uses std or value fields in param settings.
* @param $params_settings
* @param null $value
*
* @return mixed;
* @since 5.2.1
*
*/
public function getParamGroupAttributeValue( $params_settings, $value = null ) {
return $this->parseShortcodeAttributeValue( $params_settings, $value );
}
}
/**
* Class Vc_ParamGroup
* @since 4.4
*/
class Vc_ParamGroup {
/**
* @since 4.4
* @var
*/
protected $settings;
/**
* @since 4.4
* @var array|mixed
*/
protected $value;
/**
* @since 4.4
* @var
*/
protected $map;
/**
* @since 4.4
* @var
*/
protected $atts;
public $unparsed_value;
/**
* @param $settings
* @param $value
* @param $tag
*
* @since 4.4
*/
public function __construct( $settings, $value, $tag ) {
$this->settings = $settings;
$this->settings['base'] = $tag;
$this->value = vc_param_group_parse_atts( $value );
$this->unparsed_value = $value;
}
/**
* @param $param_name
* @param $arr
*
* @return array
* @since 4.4
*/
public function params_to_arr( $param_name, $arr ) {
$data = array();
foreach ( $arr as $param ) {
$data[ $param_name . '_' . $param['param_name'] ] = $param['type'];
}
return $data;
}
/**
* @return mixed|string
* @since 4.4
*/
public function render() {
$output = '';
$edit_form = new Vc_ParamGroup_Edit_Form_Fields( $this->settings );
$settings = $this->settings;
$output .= '<ul class="vc_param_group-list vc_settings" data-settings="' . htmlentities( wp_json_encode( $settings ), ENT_QUOTES, 'utf-8' ) . '">';
$template = vc_include_template( 'params/param_group/content.tpl.php' );
// Parsing values
if ( ! empty( $this->value ) ) {
foreach ( $this->value as $values ) {
$output .= $template;
$value_block = "<div class='vc_param_group-wrapper vc_clearfix'>";
$data = $values;
foreach ( $this->settings['params'] as $param ) {
$param_value = isset( $data[ $param['param_name'] ] ) ? $data[ $param['param_name'] ] : ( isset( $param['value'] ) ? $param['value'] : null );
$param['param_name'] = $this->settings['param_name'] . '_' . $param['param_name'];
$value = $edit_form->getParamGroupAttributeValue( $param, $param_value );
$value_block .= $edit_form->renderField( $param, $value );
}
$value_block .= '</div>';
$output = str_replace( '%content%', $value_block, $output );
}
} else {
$output .= $template;
}
// Empty fields wrapper and Add new fields wrapper
$content = "<div class='vc_param_group-wrapper vc_clearfix'>";
foreach ( $this->settings['params'] as $param ) {
$param['param_name'] = $this->settings['param_name'] . '_' . $param['param_name'];
$value = $edit_form->getParamGroupAttributeValue( $param );
$content .= $edit_form->renderField( $param, $value );
}
$content .= '</div>';
$output = str_replace( '%content%', $content, $output );
// And button on bottom
$output .= '<li class="wpb_column_container vc_container_for_children vc_param_group-add_content vc_empty-container"></li></ul>';
$add_template = vc_include_template( 'params/param_group/add.tpl.php' );
$add_template = str_replace( '%content%', $content, $add_template );
$custom_tag = 'script';
$output .= '<' . $custom_tag . ' type="text/html" class="vc_param_group-template">' . wp_json_encode( $add_template ) . '</' . $custom_tag . '>';
$output .= '<input name="' . $this->settings['param_name'] . '" class="wpb_vc_param_value ' . $this->settings['param_name'] . ' ' . $this->settings['type'] . '_field" type="hidden" value="' . $this->unparsed_value . '" />';
return $output;
}
}
/**
* Function for rendering param in edit form (add element)
* Parse settings from vc_map and entered values.
*
* @param $param_settings
* @param $param_value
* @param $tag
*
* @return mixed rendered template for params in edit form
* @since 4.4
*
* vc_filter: vc_param_group_render_filter
*
*/
function vc_param_group_form_field( $param_settings, $param_value, $tag ) {
$param_group = new Vc_ParamGroup( $param_settings, $param_value, $tag );
return apply_filters( 'vc_param_group_render_filter', $param_group->render() );
}
add_action( 'wp_ajax_vc_param_group_clone', 'vc_param_group_clone' );
/**
* @since 4.4
*/
function vc_param_group_clone() {
vc_user_access()->checkAdminNonce()->validateDie()->wpAny( 'edit_posts', 'edit_pages' )->validateDie();
$param = vc_post_param( 'param' );
$value = vc_post_param( 'value' );
$tag = vc_post_param( 'shortcode' );
wp_send_json_success( vc_param_group_clone_by_data( $tag, json_decode( rawurldecode( $param ), true ), json_decode( rawurldecode( $value ), true ) ) );
}
/**
* @param $tag
* @param $params
* @param $data
*
* @return mixed|string
* @since 4.4
*/
function vc_param_group_clone_by_data( $tag, $params, $data ) {
$output = '';
$params['base'] = $tag;
$edit_form = new Vc_ParamGroup_Edit_Form_Fields( $params );
$edit_form->loadDefaultParams();
$template = vc_include_template( 'params/param_group/content.tpl.php' );
$output .= $template;
$value_block = "<div class='vc_param_group-wrapper vc_clearfix'>";
$data = $data[0];
if ( isset( $params['params'] ) && is_array( $params['params'] ) ) {
foreach ( $params['params'] as $param ) {
$param_data = isset( $data[ $param['param_name'] ] ) ? $data[ $param['param_name'] ] : ( isset( $param['value'] ) ? $param['value'] : '' );
$param['param_name'] = $params['param_name'] . '_' . $param['param_name'];
$value_block .= $edit_form->renderField( $param, $param_data );
}
}
$value_block .= '</div>';
$output = str_replace( '%content%', $value_block, $output );
return $output;
}
/**
* @param $atts_string
*
* @return array|mixed
* @since 4.4
*/
function vc_param_group_parse_atts( $atts_string ) {
$array = json_decode( urldecode( $atts_string ), true );
return $array;
}
add_filter( 'vc_map_get_param_defaults', 'vc_param_group_param_defaults', 10, 2 );
/**
* @param $value
* @param $param
* @return string
*/
function vc_param_group_param_defaults( $value, $param ) {
if ( 'param_group' === $param['type'] && isset( $param['params'] ) && empty( $value ) ) {
$defaults = vc_map_get_params_defaults( $param['params'] );
$value = rawurlencode( wp_json_encode( array( $defaults ) ) );
}
return $value;
}