This repository has been archived on 2022-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
divi/includes/builder/module/field/Sticky.php

286 lines
9.3 KiB
PHP

<?php
/**
* Field definition for sticky elements feature.
*
* @package Divi
* @sub-package Builder
* @since 4.6.0
*/
/**
* Sticky field class.
*
* @since 4.6.0
*/
class ET_Builder_Module_Field_Sticky extends ET_Builder_Module_Field_Base {
/**
* Default sticky element field attributes (prefix, tab, and toggle).
*
* @var array Default sticky element field attributes.
*/
protected $defaults = array(
'prefix' => 'sticky',
'tab_slug' => 'custom_css',
'toggle_slug' => 'scroll_effects',
);
/**
* Retrieves default settings for sticky fields.
*
* @since 4.6.0
*
* @return array $settings Default settings.
*/
public function get_defaults() {
return $this->defaults;
}
/**
* Retrieves default value of specific field settings
*
* @since 4.6.0
*
* @param string $name Default name.
* @param string $default Default's default value.
*
* @return mixed
*/
public function get_default( $name = '', $default = '' ) {
return et_()->array_get( $this->defaults, $name, $default );
}
/**
* Retrieves fields for sticky settings.
*
* @since 4.6.0
*
* @param array $args Associative array for settings.
*
* @return array $fields Option settings.
*/
public function get_fields( array $args = array() ) {
static $i18n;
// Cache translations.
if ( ! isset( $i18n ) ) {
$i18n = array(
'position' => array(
'label' => esc_html__( 'Sticky Position', 'et_builder' ),
'description' => esc_html__( 'Choose to have this element remain a fixed distance from the top or bottom edge of the browser window as the user scrolls', 'et_builder' ),
'options' => array(
'do_not_sticky' => esc_html__( 'Do Not Stick', 'et_builder' ),
'sticky_to_top' => esc_html__( 'Stick to Top', 'et_builder' ),
'stick_to_bottom' => esc_html__( 'Stick to Bottom', 'et_builder' ),
'stick_to_top_bottom' => esc_html__( 'Stick to Top and Bottom', 'et_builder' ),
),
),
'offset_top' => array(
'label' => esc_html__( 'Sticky Top Offset', 'et_builder' ),
'description' => esc_html__( 'Define the vertical offset distance from the top edge of the browser window', 'et_builder' ),
),
'offset_bottom' => array(
'label' => esc_html__( 'Sticky Bottom Offset', 'et_builder' ),
'description' => esc_html__( 'Define the vertical offset distance from the bottom edge of the browser window', 'et_builder' ),
),
'limit_top' => array(
'label' => esc_html__( 'Top Sticky Limit', 'et_builder' ),
'description' => esc_html__( 'If defined, this element will stick to the top of this container, overriding its stickiness edge of the browser', 'et_builder' ),
),
'limit_bottom' => array(
'label' => esc_html__( 'Bottom Sticky Limit', 'et_builder' ),
'description' => esc_html__( 'If defined, this element will stick to the bottom of this container, overriding its stickiness to the edge of the browser', 'et_builder' ),
),
'offset_surrounding' => array(
'label' => esc_html__( 'Offset From Surrounding Sticky Elements', 'et_builder' ),
'description' => esc_html__( 'Apply “Sticky Offset” to the nearest Sticky Element above or below this element', 'et_builder' ),
),
'transition' => array(
'label' => esc_html__( 'Transition Default and Sticky Styles', 'et_builder' ),
'description' => esc_html__( 'Enabled animated transitions between default and sticky styles when the element becomes “stuck”', 'et_builder' ),
),
);
}
$settings = array_merge( $this->get_defaults(), $args );
$prefix = $settings['prefix'];
return array(
"{$prefix}_position" => array(
'label' => $i18n['position']['label'],
'description' => $i18n['position']['description'],
'tab_slug' => $settings['tab_slug'],
'toggle_slug' => $settings['toggle_slug'],
'type' => 'select',
'options' => array(
'none' => $i18n['position']['options']['do_not_sticky'],
'top' => $i18n['position']['options']['sticky_to_top'],
'bottom' => $i18n['position']['options']['stick_to_bottom'],
'top_bottom' => $i18n['position']['options']['stick_to_top_bottom'],
),
'default' => 'none',
'option_category' => 'layout',
'responsive' => true,
'mobile_options' => true,
'bb_support' => false,
),
"{$prefix}_offset_top" => array(
'label' => $i18n['offset_top']['label'],
'description' => $i18n['offset_top']['description'],
'tab_slug' => $settings['tab_slug'],
'toggle_slug' => $settings['toggle_slug'],
'type' => 'range',
'range_settings' => array(
'min' => 0,
'max' => 400,
'step' => 1,
),
'default' => '0px',
'show_if_not' => array(
"{$prefix}_position" => array( 'none', 'bottom' ),
),
'responsive' => true,
'mobile_options' => true,
'bb_support' => false,
),
"{$prefix}_offset_bottom" => array(
'label' => $i18n['offset_bottom']['label'],
'description' => $i18n['offset_bottom']['description'],
'tab_slug' => $settings['tab_slug'],
'toggle_slug' => $settings['toggle_slug'],
'type' => 'range',
'range_settings' => array(
'min' => 0,
'max' => 400,
'step' => 1,
),
'default' => '0px',
'show_if_not' => array(
"{$prefix}_position" => array( 'none', 'top' ),
),
'responsive' => true,
'mobile_options' => true,
'bb_support' => false,
),
"{$prefix}_limit_top" => array(
'label' => $i18n['limit_top']['label'],
'description' => $i18n['limit_top']['description'],
'tab_slug' => $settings['tab_slug'],
'toggle_slug' => $settings['toggle_slug'],
'type' => 'select',
'options' => $this->get_limit_options( $settings['module_slug'] ),
'default' => 'none',
'depends_show_if_not' => array( 'top', 'none' ),
'depends_on' => array(
"{$prefix}_position",
),
'responsive' => true,
'mobile_options' => true,
'bb_support' => false,
),
"{$prefix}_limit_bottom" => array(
'label' => $i18n['limit_bottom']['label'],
'description' => $i18n['limit_bottom']['description'],
'tab_slug' => $settings['tab_slug'],
'toggle_slug' => $settings['toggle_slug'],
'type' => 'select',
'options' => $this->get_limit_options( $settings['module_slug'] ),
'default' => 'none',
'depends_show_if_not' => array( 'bottom', 'none' ),
'depends_on' => array(
"{$prefix}_position",
),
'responsive' => true,
'mobile_options' => true,
'bb_support' => false,
),
"{$prefix}_offset_surrounding" => array(
'label' => $i18n['offset_surrounding']['label'],
'description' => $i18n['offset_surrounding']['description'],
'tab_slug' => $settings['tab_slug'],
'toggle_slug' => $settings['toggle_slug'],
'type' => 'yes_no_button',
'options' => array(
'on' => et_builder_i18n( 'Yes' ),
'off' => et_builder_i18n( 'No' ),
),
'default' => 'on',
'show_if_not' => array(
"{$prefix}_position" => 'none',
),
'responsive' => true,
'mobile_options' => true,
'bb_support' => false,
),
"{$prefix}_transition" => array(
'label' => $i18n['transition']['label'],
'description' => $i18n['transition']['description'],
'tab_slug' => $settings['tab_slug'],
'toggle_slug' => $settings['toggle_slug'],
'type' => 'yes_no_button',
'options' => array(
'on' => et_builder_i18n( 'Yes' ),
'off' => et_builder_i18n( 'No' ),
),
'default' => 'on',
'show_if_not' => array(
"{$prefix}_position" => 'none',
),
'responsive' => true,
'mobile_options' => true,
'bb_support' => false,
),
);
}
/**
* Get limit position options based on Element Type.
*
* @since 4.6.0
*
* @param string $module_slug Module Slug.
*
* @return array $options Limit options.
*/
private function get_limit_options( $module_slug ) {
static $i18n;
// Cache translations.
if ( ! isset( $i18n ) ) {
$i18n = array(
'none' => esc_html__( 'None', 'et_builder' ),
'body' => esc_html__( 'Body Area', 'et_builder' ),
'section' => esc_html__( 'Section', 'et_builder' ),
'row' => esc_html__( 'Row', 'et_builder' ),
'column' => esc_html__( 'Column', 'et_builder' ),
);
}
$options = array(
'none' => $i18n['none'],
'body' => $i18n['body'],
'section' => $i18n['section'],
'row' => $i18n['row'],
'column' => $i18n['column'],
);
if ( 'et_pb_column' === $module_slug ) {
unset( $options['column'] );
}
if ( 'et_pb_row' === $module_slug ) {
unset( $options['column'] );
unset( $options['row'] );
}
if ( 'et_pb_section' === $module_slug ) {
unset( $options['column'] );
unset( $options['row'] );
unset( $options['section'] );
}
return $options;
}
}
return new ET_Builder_Module_Field_Sticky();