: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Multi View Options helper class file
if ( ! defined( 'ABSPATH' ) ) {
die( 'Direct access forbidden.' );
* Multi View Options helper class
* Class ET_Builder_Module_Helper_MultiViewOptions
class ET_Builder_Module_Helper_MultiViewOptions {
* HTML data attribute key.
protected $data_attr_key = 'data-et-multi-view';
* Find and replace data regex pattern.
protected $pattern = '/\{\{(.+)\}\}/';
protected $props = array();
protected $custom_props = array();
* Conditional values data.
protected $conditional_values = array();
protected $default_values = array();
protected $cached_values = array();
* Set list of props keys that need to inherit the value
protected $inherited_values = array();
* Hover enabled option name suffix
public static $hover_enabled_suffix = '__hover_enabled';
* Responsive enabled option name suffix
public static $responsive_enabled_suffix = '_last_edited';
* Hover option name suffix
public static $hover_suffix = '__hover';
* Tablet option name suffix
public static $tablet_suffix = '_tablet';
* Phone option name suffix
public static $phone_suffix = '_phone';
* @param ET_Builder_Element $module Module object.
* @param array $custom_props Defined custom props data.
* @param array $conditional_values Defined options conditional values.
* @param array $default_values Defined options default values.
public function __construct( $module = false, $custom_props = array(), $conditional_values = array(), $default_values = array() ) {
$this->set_module( $module );
$this->set_custom_props( $custom_props );
$this->set_conditional_values( $conditional_values );
$this->set_default_values( $default_values );
* @param string $name Props name.
* @param string $mode Selected view mode.
public static function get_name_by_mode( $name, $mode ) {
if ( 'tablet' === $mode || 'phone' === $mode ) {
return "{$name}_{$mode}";
if ( 'hover' === $mode ) {
* Get regex field name suffix
public static function get_regex_suffix() {
return '/(__hover|__hover_enabled|_last_edited|_tablet|_phone)$/';
* @param string $name Props name.
public static function get_name_base( $name ) {
return preg_replace( self::get_regex_suffix(), '', $name );
public static function get_modes() {
return array( 'desktop', 'tablet', 'phone', 'hover' );
* Check if mode is enabled
* @param string $name Props name.
* @param string $mode Selected view mode.
public function mode_is_enabled( $name, $mode ) {
return $this->hover_is_enabled( $name );
return $this->responsive_is_enabled( $name );
* Get responsive options filed suffixes
* @param bool $include_enabled_suffix Whether to include the responsive enabled suffix or not.
public static function responsive_suffixes( $include_enabled_suffix = true ) {
$suffixes = array( self::$tablet_suffix, self::$phone_suffix );
if ( $include_enabled_suffix ) {
$suffixes[] = self::$responsive_enabled_suffix;
* Get hover options filed suffixes
* @param bool $include_enabled_suffix Whether to include the hover enabled suffix or not.
public static function hover_suffixes( $include_enabled_suffix = true ) {
$suffixes = array( self::$hover_suffix );
if ( $include_enabled_suffix ) {
$suffixes[] = self::$hover_enabled_suffix;
* Check whether an option is responsive enabled.
* @param string $name options name.
public function responsive_is_enabled( $name ) {
return et_pb_responsive_options()->is_enabled( $name, $this->props );
* Check whether an option is hover enabled.
* @param string $name options name.
public function hover_is_enabled( $name ) {
return et_pb_hover_options()->is_enabled( $name, $this->props );
* Get module props desktop mode value.
* @param string $name Props name.
* @param mixed $default_value Default value as fallback data.
* @return mixed Value of selected mode.
public function get_value_desktop( $name, $default_value = null ) {
return $this->get_value( $name, 'desktop', $default_value );
* Get module props tablet mode value.
* @param string $name Props name.
* @param mixed $default_value Default value as fallback data.
* @return mixed Value of selected mode.
public function get_value_tablet( $name, $default_value = null ) {
return $this->get_value( $name, 'tablet', $default_value );
* Get module props phone mode value.
* @param string $name Props name.
* @param mixed $default_value Default value as fallback data.
* @return mixed Value of selected mode.
public function get_value_phone( $name, $default_value = null ) {
return $this->get_value( $name, 'phone', $default_value );
* Get module props hover mode value.
* @param string $name Props name.
* @param mixed $default_value Default value as fallback data.
* @return mixed Value of selected mode.
public function get_value_hover( $name, $default_value = null ) {
return $this->get_value( $name, 'hover', $default_value );
* Get module props value.
* @param string $name Props name.
* @param string $mode Select only specified modes: desktop, tablet, phone, hover.
* @param mixed $default_value Default value as fallback data.
* @return mixed Value of selected mode.
public function get_value( $name, $mode = 'desktop', $default_value = null ) {
return et_()->array_get( $this->get_values( $name ), $mode, $default_value );
* Get module props values.
* @param string $name Props name.
* @param bool $distinct Wether to distinct the values or not.
* @return array Values of all view modes: desktop, tablet, phone, hover.
public function get_values( $name, $distinct = true ) {
if ( ! isset( $this->cached_values[ $name ] ) ) {
if ( isset( $this->custom_props[ $name ] ) ) {
foreach ( self::get_modes() as $mode ) {
$value = et_()->array_get( $this->custom_props[ $name ], $mode, '' );
if ( '' === $value && isset( $this->default_values[ $name ][ $mode ] ) ) {
$value = $this->default_values[ $name ][ $mode ];
if ( ! $this->is_props_inherited( self::get_name_by_mode( $name, $mode ), $value ) ) {
$values[ $mode ] = $value;
foreach ( self::get_modes() as $mode ) {
if ( ! $this->mode_is_enabled( $name, $mode ) ) {
$value = et_()->array_get( $this->props, self::get_name_by_mode( $name, $mode ), '' );
if ( '' === $value && isset( $this->default_values[ $name ][ $mode ] ) ) {
$value = $this->default_values[ $name ][ $mode ];
if ( ! $this->is_props_inherited( self::get_name_by_mode( $name, $mode ), $value ) ) {
$values[ $mode ] = $value;
// Normalize the values to make to all the view modes has own data.
$this->cached_values[ $name ] = $this->normalize_values( $values );
// Distinct the values to omit duplicate values across modes.
return $this->distinct_values( $this->cached_values[ $name ] );
return $this->cached_values[ $name ];
* @param string $value Source value.
* @param [type] $value_compare Target value to compare.
protected static function compare_value( $value, $value_compare = null ) {
if ( is_null( $value_compare ) ) {
$match = is_string( $value ) || is_numeric( $value ) ? strlen( $value ) : ! empty( $value );
} elseif ( is_bool( $value_compare ) ) {
$match = $value_compare === $value;
} elseif ( is_array( $value_compare ) ) {
$match = in_array( $value, $value_compare, true );
} elseif ( '__empty' === $value_compare ) {
$match = empty( $value );
} elseif ( '__not_empty' === $value_compare ) {
$match = ! empty( $value );
$match = strtolower( strval( $value_compare ) ) === strtolower( strval( $value ) );
return $match ? true : false;
* Check if module props has value in any of data breakpoint: desktop, tablet, phone, hover.
* @param string $name Field key.
* @param string|callable $value_compare The value to compare.
* @param string $selected_mode Selected view mode.
* @param bool $inherit Should the value inherited from previous breakpoint.
public function has_value( $name, $value_compare = null, $selected_mode = false, $inherit = false ) {
if ( $selected_mode && is_string( $selected_mode ) ) {
$selected_mode = false !== strpos( $selected_mode, ',' ) ? explode( ',', $selected_mode ) : array( $selected_mode );
if ( $selected_mode && ! is_array( $selected_mode ) ) {
$selected_mode = array( $selected_mode );
$values = $this->get_values( $name, false );