get_settings();
if ( 'yes' === $settings['display_condition_enable'] ) {
$id = $element->get_id();
$to = $settings['display_condition_to'];
$lists = $settings['display_condition_list'];
$this->conditions_result_store( $settings, $id, $lists );
$check_result = $this->check_condition( $id, $settings['display_condition_relation'] );
if ( ( 'show' === $to && $check_result ) || ( 'hide' === $to && false === $check_result ) ) {
$should_render = true;
} elseif ( ( 'show' === $to && false === $check_result ) || ( 'hide' === $to && $check_result ) ) {
$should_render = false;
}
}
return $should_render;
}
/**
* Key option for Repeater field.
*
* @since 1.32.0
*/
public static function conditions_keys() {
$options = array();
foreach ( static::$conditions as $key => $value ) {
$options[ $value->get_key_name() ] = $value->get_title();
}
return $options;
}
/**
* Add Control Field to Display Condition
*
* @since 1.32.0
* @param array $element return array element.
* @param array $args return arguments.
*/
public function add_controls( $element, $args ) {
$repeater = new Repeater();
$element->add_control(
'display_condition_enable',
array(
'label' => __( 'Enable Conditions', 'uael' ),
'type' => Controls_Manager::SWITCHER,
'label_on' => __( 'On', 'uael' ),
'label_off' => __( 'Off', 'uael' ),
'return_value' => 'yes',
'default' => '',
'frontend_available' => true,
)
);
$element->add_control(
'display_condition_to',
array(
'label' => __( 'To', 'uael' ),
'type' => Controls_Manager::SELECT,
'default' => 'show',
'options' => array(
'show' => __( 'Show Element', 'uael' ),
'hide' => __( 'Hide Element', 'uael' ),
),
'condition' => array(
'display_condition_enable' => 'yes',
),
)
);
$element->add_control(
'display_condition_relation',
array(
'label' => __( 'When', 'uael' ),
'type' => Controls_Manager::SELECT,
'default' => 'and',
'options' => array(
'and' => __( 'All Conditions Met', 'uael' ),
'or' => __( 'Any Condition Met', 'uael' ),
),
'condition' => array(
'display_condition_enable' => 'yes',
),
)
);
$repeater->add_control(
'display_condition_key',
array(
'type' => Controls_Manager::SELECT,
'default' => 'role',
'label_block' => true,
'options' => static::conditions_keys(),
)
);
$repeater->add_control(
'display_condition_operator',
array(
'type' => Controls_Manager::SELECT,
'default' => 'is',
'label_block' => true,
'options' => array(
'is' => __( 'Is', 'uael' ),
'not' => __( 'Is not', 'uael' ),
),
'condition' => array(
'display_condition_key!' => 'advanced_date',
),
)
);
$repeater->add_control(
'display_condition_operator_advanced_date',
array(
'type' => Controls_Manager::SELECT,
'default' => 'less',
'label_block' => true,
'options' => array(
'less' => __( 'Is Less than', 'uael' ),
'greater' => __( 'Is Greater than', 'uael' ),
'less_than_equal' => __( 'Is Less than equal to', 'uael' ),
'greater_than_equal' => __( 'Is Greater than equal to', 'uael' ),
),
'condition' => array(
'display_condition_key' => 'advanced_date',
),
)
);
$this->add_repeater_controls( $repeater );
$element->add_control(
'display_condition_list',
array(
'label' => __( 'Conditions', 'uael' ),
'type' => Controls_Manager::REPEATER,
'fields' => $repeater->get_controls(),
'default' => array(
array(
'display_condition_key' => 'role',
'display_condition_operator' => 'is',
'display_condition_login_status' => 'subscriber',
),
),
'title_field' => '<#
if ( display_condition_key == "acf_text" ) {
print("ACF Field");
} else {
print( display_condition_key.replace(/_/i, " ").split(" ").map( word => word.charAt(0).toUpperCase() + word.slice(1) ).join(" ") );
}
#>',
'condition' => array(
'display_condition_enable' => 'yes',
),
)
);
$element->add_control(
'display_condition_time_zone',
array(
'label' => __( 'Timezone', 'uael' ),
'type' => Controls_Manager::SELECT,
// translators: 1: admin link 2: Timezone.
'description' => __( 'You can change Server', 'uael' ) . sprintf( ' %2$s', admin_url() . '/options-general.php', __( 'Timezone', 'uael' ) ) . sprintf( __( ' It will fetch the time as per selected option. %1$s Learn more %2$s ', 'uael' ), '', '' ),
'default' => 'local',
'options' => array(
'server' => __( 'Server Timezone', 'uael' ),
'local' => __( 'Local Timezone', 'uael' ),
),
'condition' => array(
'display_condition_enable' => 'yes',
),
)
);
$element->add_control(
'display-note',
array(
'type' => Controls_Manager::RAW_HTML,
'raw' => esc_html__( 'Note: Display conditions feature will work on the frontend.', 'uael' ),
'content_classes' => 'elementor-panel-alert elementor-panel-alert-warning',
'condition' => array(
'display_condition_enable' => 'yes',
),
)
);
}
/**
* Add Repeater field.
*
* @since 1.32.0
* @param array $repeater repeater field.
*/
public function add_repeater_controls( $repeater ) {
$condition = array();
foreach ( static::$conditions as $key => $value ) {
$key_name = $value->get_key_name();
$repeater_field_id = 'display_condition_' . $key_name;
$condition[ $key_name ] = array(
'display_condition_key' => $key_name,
);
if ( 'display_condition_time_span' === $repeater_field_id ) {
$repeater->add_control(
'display_condition_time_span_start',
$value->get_repeater_control( $condition[ $key_name ] )
);
$repeater->add_control(
'display_condition_time_span_end',
$value->get_due_control( $condition[ $key_name ] )
);
} elseif ( 'display_condition_acf_text' === $repeater_field_id ) {
$repeater->add_control(
'display_condition_acf_text_key',
$value->get_acf_field( $condition[ $key_name ] )
);
$repeater->add_control(
'display_condition_acf_text_value',
$value->get_repeater_control( $condition[ $key_name ] )
);
} elseif ( 'display_condition_request_parameter' === $repeater_field_id ) {
$repeater->add_control(
'display_condition_request_parameter_key',
$value->get_repeater_control( $condition[ $key_name ] )
);
$repeater->add_control(
'display_condition_request_parameter_value',
$value->get_value_control( $condition[ $key_name ] )
);
} else {
$repeater->add_control(
$repeater_field_id,
$value->get_repeater_control( $condition[ $key_name ] )
);
}
}
}
/**
* Condition Result Store in $conditions_result_store property.
*
* @since 1.32.0
* @param array $settings return settings.
* @param Number $section_id return section ID.
* @param array $lists return lists of controls.
*/
protected function conditions_result_store( $settings, $section_id, $lists = array() ) {
if ( ! $lists ) {
return;
}
foreach ( $lists as $key => $list ) {
$class = static::$conditions[ $list['display_condition_key'] ];
if ( 'advanced_date' === $list['display_condition_key'] ) {
$operator = $list['display_condition_operator_advanced_date'];
} else {
$operator = $list['display_condition_operator'];
}
$item_key = 'display_condition_' . $list['display_condition_key'];
$value = isset( $list[ $item_key ] ) ? $list[ $item_key ] : '';
$id = $item_key . '_' . $list['_id'];
if ( 'time_span' === $list['display_condition_key'] ) {
$start = 'display_condition_' . $list['display_condition_key'] . '_start';
$end = 'display_condition_' . $list['display_condition_key'] . '_end';
$key_val_start = $list[ $start ];
$key_val_end = $list[ $end ];
$check = $class->time_compare_value( $settings, $operator, $key_val_start, $key_val_end );
} elseif ( 'request_parameter' === $list['display_condition_key'] ) {
$key = 'display_condition_' . $list['display_condition_key'] . '_key';
$value = 'display_condition_' . $list['display_condition_key'] . '_value';
$main_key = $list[ $key ];
$main_value = $list[ $value ];
$check = $class->compare_request_param( $settings, $operator, $main_key, $main_value );
} elseif ( 'acf_text' === $list['display_condition_key'] ) {
$key = 'display_condition_' . $list['display_condition_key'] . '_key';
$value = 'display_condition_' . $list['display_condition_key'] . '_value';
$main_key = $list[ $key ];
$main_value = $list[ $value ];
$check = $class->acf_compare_value( $settings, $operator, $main_key, $main_value );
} else {
$check = $class->compare_value( $settings, $operator, $value );
}
$this->conditions_result_store[ $section_id ][ $id ] = $check;
}
}
/**
* Condition Check base on relation status
*
* @since 1.32.0
* @param Number $section_id return section ID.
* @param String $relation relation operator.
* @return bool|void
*/
protected function check_condition( $section_id, $relation ) {
$result = true;
if ( ! array_key_exists( $section_id, $this->conditions_result_store ) ) {
return;
}
if ( 'or' === $relation ) {
// if any condition true.
$result = in_array( true, $this->conditions_result_store[ $section_id ], true ) ? true : false;
} else {
// if any condition not true.
$result = in_array( false, $this->conditions_result_store[ $section_id ], true ) ? false : true;
}
return $result;
}
/**
* Constructor.
*
* @since 1.32.0
*/
public function __construct() {
$this->condition_init();
$this->init_actions();
}
}