';
}
return apply_filters( 'forminator_before_wrapper_markup', $html );
}
/**
* Return after wrapper markup
*
* @since 1.0
*
* @param array $wrapper Wrapper.
*
* @return mixed
*/
public function render_wrapper_after( $wrapper ) {
$html = '
';
return apply_filters( 'forminator_after_wrapper_markup', $html );
}
/**
* Return fields markup
*
* @since 1.0
*
* @param bool $render Render.
*
* @return string
*/
public function render_fields( $render = true ) {
$html = '';
$wrappers = $this->get_fields();
$form_settings = $this->get_form_settings();
$visual_style = isset( $form_settings['visual_style'] ) ? $form_settings['visual_style'] : 'list';
if ( ! empty( $wrappers ) ) {
$html .= '
';
foreach ( $wrappers as $key => $wrapper ) {
if ( ! isset( $wrapper['fields'] ) ) {
return;
}
// Render before wrapper markup.
$html .= $this->render_wrapper_before( $wrapper );
foreach ( $wrapper['fields'] as $k => $field ) {
$form_settings = $this->get_form_settings();
$images_enabled = isset( $form_settings['enable_images'] ) ? filter_var( $form_settings['enable_images'], FILTER_VALIDATE_BOOLEAN ) : false;
$option_image_url = array_key_exists( 'answer_image', $field ) ? $field['answer_image'] : '';
$field_title = isset( $field['title'] ) ? trim( (string) $field['title'] ) : '';
if ( '' !== $field_title ) {
$uniq_id = uniqid();
do_action( 'forminator_before_field_render', $field );
if ( $images_enabled && 'grid' === $visual_style ) {
$html .= '
';
}
if ( $render ) {
echo wp_kses_post( $html );
} else {
return apply_filters(
'forminator_render_fields_markup',
$html,
$wrappers,
$this
);
}
}
/**
* Return field markup of Radio for poll
*
* @since 1.0
*
* @param array $field Field.
* @param string $uniq_id Unique Id.
*
* @return mixed
*/
public function render_field_radio( $field, $uniq_id ) {
$label = Forminator_Field::get_property( 'title', $field, $this->model->id );
$form_settings = $this->get_form_settings();
// Get field object.
$element_id = Forminator_Field::get_property( 'element_id', $field );
$name = $this->model->id;
$design = isset( $form_settings['forminator-poll-design'] ) ? $form_settings['forminator-poll-design'] : 'default';
$images_enabled = isset( $form_settings['enable_images'] ) ? filter_var( $form_settings['enable_images'], FILTER_VALIDATE_BOOLEAN ) : false;
$input_visibility = isset( $form_settings['input_visibility'] ) ? filter_var( $form_settings['input_visibility'], FILTER_VALIDATE_BOOLEAN ) : true;
$option_image_url = array_key_exists( 'answer_image', $field ) ? $field['answer_image'] : '';
$option_image_alt = array_key_exists( 'answer_image_alt', $field ) ? $field['answer_image_alt'] : '';
if ( ! isset( $field['value'] ) ) {
$field['value'] = sanitize_title( $label );
}
// form_id - render_id - element_id.
$input_id = $name . '-' . self::$render_ids[ $this->model->id ] . '-' . $element_id;
$aria_label = sprintf(
'
%s',
wp_kses(
$label,
array(
'a' => array(
'href' => array(),
'title' => array(),
),
'span' => array(
'class' => array(),
),
'b' => array(),
'i' => array(),
'br' => array(),
'em' => array(),
'strong' => array(),
)
)
);
$class = 'forminator-radio';
if ( $images_enabled && ! empty( $option_image_url ) ) {
$class .= ' forminator-has_image';
if ( $input_visibility ) {
$class .= ' forminator-has_bullet';
}
}
// Print field markup.
$html = sprintf( '
';
return apply_filters( 'forminator_field_markup', $html, $field, $this );
}
/**
* Radio field markup
*
* @since 1.0
*
* @param array $field Field.
* @param int $id Id.
* @param string $name Name.
*
* @return mixed
*/
public function radio_field_markup( $field, $id, $name ) {
$required = Forminator_Field::get_property( 'required', $field, false );
$value = Forminator_Field::get_property( 'element_id', $field );
$disabled = '';
if ( ! $this->is_preview && ! $this->model->current_user_can_vote() ) {
$disabled = 'disabled="disabled"';
}
$html = sprintf(
'
',
esc_attr( $id ),
boolval( $required ),
esc_attr( $name ),
esc_attr( $value ),
$disabled
);
return apply_filters( 'forminator_field_radio_markup', $html, $id, $name, $required, $value );
}
/**
* Render extra field
*
* @since 1.0
*
* @param array $field Field.
* @param string $uniq_id Unique Id.
* @param array $form_settings Form settings.
*
* @return mixed
*/
public function render_extra_field( $field, $uniq_id, $form_settings = array() ) {
$label = Forminator_Field::get_property( 'title', $field, $this->model->id );
$extra = Forminator_Field::get_property( 'extra', $field );
$design = $this->get_form_design();
// Get field object.
$element_id = Forminator_Field::get_property( 'element_id', $field );
$name = $this->model->id;
// form_id - render_id - element_id.
$input_id = $name . '-' . self::$render_ids[ $this->model->id ] . '-' . $element_id;
$html = '';
if ( ! isset( $field['value'] ) ) {
$field['value'] = sanitize_title( $label );
}
if ( '' !== $label || '' !== $extra ) {
$html = sprintf(
'
',
$input_id . '-extra',
( '' !== $label ) ? esc_html( $label ) : esc_html( $extra )
);
}
if ( 'material' === $design ) {
$html .= '
';
}
$html .= sprintf(
'',
$name . '-extra',
esc_html( $extra ),
$input_id . '-extra'
);
if ( 'material' === $design ) {
$html .= '
';
}
return apply_filters( 'forminator_field_textfield_extra_markup', $html, $name );
}
/**
* Return form design
*
* @since 1.0
* @return mixed
*/
public function get_form_design() {
$form_settings = $this->get_form_settings();
if ( ! isset( $form_settings['forminator-poll-design'] ) ) {
return 'default';
}
return $form_settings['forminator-poll-design'];
}
/**
* Results chart
*
* @param array $settings Settings.
*
* @since 1.0
* @return string
*/
public static function get_chart_design( $settings ) {
if ( ! isset( $settings['results-style'] ) ) {
return 'bar';
}
return $settings['results-style'];
}
/**
* Results chart design
*
* @since 1.0
* @return string
*/
private function get_show_results() {
$form_settings = $this->get_form_settings();
if ( ! isset( $form_settings['results-behav'] ) || empty( $form_settings['results-behav'] ) ) {
return 'not_show';
}
return $form_settings['results-behav'];
}
/**
* Show results after poll submit
*
* @since 1.0
* @return bool
*/
private function show_results() {
$show_results = $this->get_show_results();
if ( 'show_after' === $show_results ) {
return true;
}
return false;
}
/**
* Show link after submit
*
* @since 1.0
* @return bool
*/
private function show_link() {
$show_results = $this->get_show_results();
if ( 'link_on' === $show_results ) {
return true;
}
return false;
}
/**
* Render success
*
* @param bool $render Render.
* @param array $form_settings Settings.
*
* @since 1.0
* @return string
*/
public function render_success( $render = true, $form_settings = array() ) {
$design = $this->get_form_design();
$settings = $this->get_form_settings();
$answers_count = $this->get_fields();
$answers_count = count( $answers_count[0]['fields'] );
$adjusted_height = $answers_count < 6 ? 200 : $answers_count * 35;
$alignment = isset( $form_settings['poll_alignment'] ) ? $form_settings['poll_alignment'] : 'left';
if ( is_object( $this->model ) ) {
$post_id = $this->get_post_id();
$return_url = get_permalink( $post_id );
$chart_container = 'forminator_chart_poll_' . uniqid() . '_' . $this->model->id;
ob_start();
?>
$this->model,
'container' => $chart_container,
);
$html = ob_get_clean();
if ( $render ) {
$html = apply_filters( 'forminator_render_form_success_markup', $html, $this->model );
// Return form with canvas.
echo $html; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
return apply_filters( 'forminator_render_form_success_markup', $html, $this->model );
}
}
}
/**
* Graph scripts
*
* @return void
*/
public function graph_scripts() {
foreach ( self::$graph_result_scripts as $graph_script ) {
$this->success_footer_script( $graph_script['model'], $graph_script['container'] );
}
}
/**
* Return chart type
*
* @return string
*/
public function get_chart_type() {
$type = 'none';
$form_settings = $this->get_form_settings();
if ( isset( $form_settings['results-behav'] ) && ( 'link_on' === $form_settings['results-behav'] || 'show_after' === $form_settings['results-behav'] ) ) {
$type = $form_settings['results-style'];
}
return $type;
}
/**
* Get Options for google chart
*
* @param object $model Model.
*
* @return array
*/
public static function get_default_chart_options( $model ) {
$chart_colors = forminator_get_poll_chart_colors( $model->id );
$chart_design = 'bar';
$pie_tooltip_text = 'percentage';
$form_settings = $model->settings;
if ( isset( $form_settings['results-style'] ) ) {
$chart_design = $form_settings['results-style'];
}
if ( isset( $form_settings['show-votes-count'] ) && $form_settings['show-votes-count'] ) {
if ( 'pie' === $chart_design ) {
$pie_tooltip_text = 'both';
}
}
if ( 'pie' !== $chart_design ) {
$chart_options = array(
'annotations' => array(
'textStyle' => array(
'fontSize' => 13,
'bold' => false,
'color' => '#333',
),
),
'backgroundColor' => 'transparent',
'fontSize' => 13,
'fontName' => 'Roboto',
'hAxis' => array(
'format' => 'decimal',
'baselineColor' => '#4D4D4D',
'gridlines' => array(
'color' => '#E9E9E9',
),
'textStyle' => array(
'color' => '#4D4D4D',
'fontSize' => 13,
'bold' => false,
'italic' => false,
),
'minValue' => 0,
),
'vAxis' => array(
'baselineColor' => '#4D4D4D',
'gridlines' => array(
'color' => '#E9E9E9',
),
'textStyle' => array(
'color' => '#4D4D4D',
'fontSize' => 13,
'bold' => false,
'italic' => false,
),
'minValue' => 0,
),
'tooltip' => array(
'isHtml' => true,
),
'legend' => array(
'position' => 'none',
),
);
} else {
$chart_options = array(
'colors' => $chart_colors,
'backgroundColor' => 'transparent',
'fontSize' => 13,
'fontName' => 'Roboto',
'tooltip' => array(
'isHtml' => true,
'trigger' => 'focus',
'text' => $pie_tooltip_text,
),
'chartArea' => array(
'width' => '90%',
),
);
}
return apply_filters( 'forminator_poll_chart_options', $chart_options, $model );
}
/**
* Success footer scripts
*
* @param object $model Model.
* @param string $container_id Container Id.
*
* @since 1.0
*/
public function success_footer_script( $model, $container_id ) {
if ( ! is_object( $model ) ) {
return '';
}
$form_settings = $model->settings;
$chart_design = 'bar';
if ( isset( $form_settings['results-style'] ) ) {
$chart_design = $form_settings['results-style'];
}
if ( ! in_array( $chart_design, array( 'bar', 'pie' ), true ) ) {
$chart_design = 'bar';
}
$number_votes_enabled = (bool) false;
if ( isset( $form_settings['show-votes-count'] ) && $form_settings['show-votes-count'] ) {
$number_votes_enabled = (bool) true;
}
$chart_colors = forminator_get_poll_chart_colors( $model->id );
$default_chart_colors = $chart_colors;
$votes_count = 'false';
// Votes count.
if ( isset( $form_settings['show-votes-count'] ) ) {
$votes_count = $form_settings['show-votes-count'];
}
$chart_data = forminator_get_chart_data( $model );
// Chart basic colors.
$grids_color = ( isset( $form_settings['grid_lines'] ) && ! empty( $form_settings['grid_lines'] ) ) ? $form_settings['grid_lines'] : '#E5E5E5';
$labels_color = ( isset( $form_settings['grid_labels'] ) && ! empty( $form_settings['grid_labels'] ) ) ? $form_settings['grid_labels'] : '#777771';
$onchart_label = ( isset( $form_settings['onbar_votes'] ) && ! empty( $form_settings['onbar_votes'] ) ) ? $form_settings['onbar_votes'] : '#333333';
// Tooltips.
$tooltips_bg = ( isset( $form_settings['tooltips_background'] ) && ! empty( $form_settings['tooltips_background'] ) && ! empty( $form_settings['poll-colors'] ) ) ? $form_settings['tooltips_background'] : '#333333';
$tooltips_color = ( isset( $form_settings['tooltips_text'] ) && ! empty( $form_settings['tooltips_text'] ) && ! empty( $form_settings['poll-colors'] ) ) ? $form_settings['tooltips_text'] : '#FFFFFF';
?>
get_form_settings();
if ( isset( $settings['show-votes-count'] ) && $settings['show-votes-count'] ) {
return true;
}
return false;
}
/**
* Get CSS prefix
*
* @param string $prefix Default prefix.
* @param array $properties CSS properties.
* @param string $slug Slug.
* @return string
*/
protected static function get_css_prefix( $prefix, $properties, $slug ) {
if ( ! isset( $properties['forminator-poll-design'] ) || 'none' !== $properties['forminator-poll-design'] ) {
$prefix .= ' ';
}
return $prefix;
}
/**
* Html markup of form
*
* @since 1.6.1
*
* @param bool $hide Hide.
* @param bool $is_preview Is preview.
* @param int $render_id Render ID.
*
* @return false|string
*/
public function get_html( $hide = true, $is_preview = false, $render_id = null ) {
ob_start();
$is_same_form = false;
$is_same_render = false;
$rendered = false;
$form_id = Forminator_Core::sanitize_text_field( 'form_id' );
if ( null === $render_id ) {
$render_id = Forminator_Core::sanitize_text_field( 'render_id' );
}
$saved = Forminator_Core::sanitize_text_field( 'saved' );
$results = Forminator_Core::sanitize_text_field( 'results' );
if ( (int) $form_id === (int) $this->model->id ) {
$is_same_form = true;
}
if ( (int) $render_id === (int) self::$render_ids[ $this->model->id ] ) {
$is_same_render = true;
}
$status_info = $this->model->opening_status();
if ( 'open' !== $status_info['status'] ) {
$this->track_views = false;
$this->render( $this->model->id, $hide, $is_preview, $render_id );
$rendered = true;
} elseif ( $saved && $is_same_form && $is_same_render && $this->show_results() ) {
$this->track_views = false;
$this->render_success();
} elseif ( $results && $is_same_form && $is_same_render && $this->show_link() ) {
$this->track_views = false;
$this->render_success();
} elseif ( ( ! $this->is_admin || $is_preview ) && ( ! $this->model->current_user_can_vote() && ( $this->show_results() || $this->show_link() ) ) ) {
$this->track_views = false;
$this->render_success();
} else {
$this->render( $this->model->id, $hide, $is_preview, $render_id );
$rendered = true;
}
$this->set_forms_properties( $rendered );
$html = ob_get_clean();
return $html;
}
/**
* Set module properties
*
* @param bool $rendered Rendered flag.
*/
protected function set_forms_properties( $rendered = false ) {
$this->forms_properties[] = array(
'id' => $this->model->id,
'render_id' => ! empty( self::$render_ids[ $this->model->id ] )
? self::$render_ids[ $this->model->id ] : 0,
'settings' => $this->get_form_settings(),
'chart_design' => self::get_chart_design( $this->get_form_settings() ),
'chart_options' => self::get_default_chart_options( $this->model ),
'rendered' => $rendered,
);
}
/**
* Set options to Model object.
*
* @param object $form_model Model.
* @param array $data Data.
* @return object
*/
protected function set_form_model_data( $form_model, $data ) {
$answers = array();
// Check if answers exist.
if ( isset( $data['answers'] ) ) {
$answers = forminator_sanitize_field( $data['answers'] );
}
foreach ( $answers as $answer ) {
$field_model = new Forminator_Form_Field_Model();
$answer['id'] = $answer['element_id'];
$field_model->import( $answer );
$field_model->slug = $answer['element_id'];
$form_model->add_field( $field_model );
}
return $form_model;
}
/**
* Enqueue poll scripts
*
* @param bool $is_preview Is preview.
* @param bool $is_ajax_load Is ajax load.
*/
public function enqueue_form_scripts( $is_preview, $is_ajax_load = false ) {
ob_start();
$this->graph_scripts();
$this->script = ob_get_clean();
}
/**
* Get forminatorFront js init options to be passed
*
* @since 1.6.1
*
* @param array $form_properties Form properties.
*
* @return array
*/
public function get_front_init_options( $form_properties ) {
if ( empty( $form_properties ) ) {
return array();
}
$options = array(
'form_type' => $this->get_form_type(),
'chart_design' => $form_properties['chart_design'],
'chart_options' => $form_properties['chart_options'],
);
return $options;
}
/**
* Skip ajax loader JS when the poll was already fully rendered (user already voted).
*
* @param bool $is_preview Is preview.
* @param array $preview_data Preview data.
* @param array $lead_data Lead data.
* @param bool $is_block_editor Is block editor.
*/
public function ajax_loader( $is_preview, $preview_data = array(), $lead_data = array(), $is_block_editor = false ) {
if ( is_object( $this->model ) && ! $this->model->current_user_can_vote() ) {
return;
}
parent::ajax_loader( $is_preview, $preview_data, $lead_data, $is_block_editor );
}
}