render_items ) ) { $this->render_items = array(); } // Flag to check row has items. $this->rows[ $row_id ][ $device ] = $device; // Flag to check col has item. $flag_key_col = $col_id . '-' . $row_id . '-' . $device; $this->flag_cols[ $flag_key_col ] = true; // Flag to check row has item. $flag_key_row = $row_id . '-' . $device; $this->flag_rows[ $flag_key_row ] = true; // Check if already render. if ( isset( $this->render_items[ $key ] ) ) { return $this->render_items[ $key ]; } $item = array( '_row_id' => $row_id, '_col_id' => $col_id, '_id' => $item_id, '_device' => $device, 'content' => false, ); // START render builder item. ob_start(); $has_cb = false; $return_render = false; $item_config = isset( $this->config_items[ $item_id ] ) ? $this->config_items[ $item_id ] : array(); /** * Hook before builder item * * @since 0.2.1 */ do_action( 'starterblog/builder/' . $this->id . '/before-item/' . $item_id ); $object_item = StarterBlog_Customize_Layout_Builder()->get_builder_item( $this->id, $item_id ); // Call render in registered class. if ( $object_item ) { if ( method_exists( $object_item, 'render' ) ) { $return_render = call_user_func_array( array( $object_item, 'render', ), array( $item_config, $item_id ) ); $has_cb = true; } } // Call render by function if class do not exists. if ( ! $has_cb ) { $id = str_replace( '-', '_', $item_id ); $fn = 'starterblog_builder_' . $id . '_item'; if ( function_exists( $fn ) ) { $return_render = call_user_func_array( $fn, array( $item_config, $item ) ); $has_cb = true; } else { $fn = 'starterblog_builder_' . $this->id . '_' . $id . '_item'; if ( function_exists( $fn ) ) { $return_render = call_user_func_array( $fn, array( $item_config, $item ) ); $has_cb = true; } } } /** * Hook after builder item * * @since 0.2.1 */ do_action( 'starterblog/builder/' . $this->id . '/after-item/' . $item_id ); // Get item output. $ob_render = ob_get_clean(); // END render builder item. if ( ! $return_render ) { if ( $ob_render ) { $return_render = $ob_render; } } if ( $return_render ) { $item ['content'] = $return_render; } $this->render_items[ $key ] = $item; return $item; } /** * Render items to HTML * * @param array $list_items List Items. * * @return array */ function render_items( $list_items = array() ) { if ( ! is_null( $this->render_items ) ) { return $this->render_items; } $setting = $this->get_settings(); $items = array(); // Loop devices. foreach ( $setting as $device => $device_settings ) { foreach ( $device_settings as $row_id => $row_cols ) { if ( is_array( $row_cols ) && ! empty( $row_cols ) ) { foreach ( $row_cols as $col_id => $col_items ) { foreach ( $col_items as $index => $item ) { $this->render_item( $item['id'], $col_id, $row_id, $device ); } } } } } if ( is_null( $this->render_items ) ) { $this->render_items = array(); } return $this->render_items; } /** * Get rendered item * * @param string $item_id * @return array|bool */ public function get_render_item( $item_id ) { if ( is_null( $this->render_items ) ) { $this->render_items(); } if ( isset( $this->render_items[ $item_id ] ) ) { return $this->render_items[ $item_id ]; } return false; } public function render_row( $row_settings, $id = '', $device = 'desktop' ) { $flag_key_row = $id . '-' . $device; // Check if the row are not showing. if ( ! isset( $this->flag_rows[ $flag_key_row ] ) ) { return false; } ob_start(); $count = 0; $no_cols = array(); $row_clases = array( 'row-v2', 'row-v2-' . $id ); $has_center = false; foreach ( $row_settings as $col_id => $col_items ) { $flag_key_col = $col_id . '-' . $id . '-' . $device; // Check if current column has items. if ( isset( $this->flag_cols[ $flag_key_col ] ) ) { $count ++; if ( 'center' == $col_id ) { $has_center = true; } echo '
'; foreach ( $col_items as $item_index => $col_item ) { $item = $this->get_render_item( $col_item['id'] ); if ( $item ) { $item_id = $col_item['id']; $content = $item['content']; if ( $content ) { $item_config = isset( $this->config_items[ $item_id ] ) ? $this->config_items[ $item_id ] : array(); if ( ! isset( $item_config['section'] ) ) { $item_config['section'] = ''; } $item_classes = array(); $item_classes[] = 'item--inner'; $item_classes[] = 'builder-item--' . $item_id; if ( strpos( $item_id, '-menu' ) ) { $item_classes[] = 'has_menu'; } if ( is_customize_preview() ) { $item_classes[] = ' builder-item-focus'; } $item_classes = join( ' ', $item_classes ); $row_items_html = ''; $row_items_html .= '
'; $row_items_html .= $this->setup_item_content( $content, $id, $device ); if ( is_customize_preview() ) { $row_items_html .= '' . esc_html( $item_config['name'] ) . ''; } $row_items_html .= '
'; echo $row_items_html; } } } echo '
'; } else { $no_key = 'no-' . $col_id; $no_cols[ $no_key ] = $no_key; } // End check show col. } // and loop cols $row_innner_html = ob_get_clean(); if ( $has_center ) { if ( isset( $no_cols['no-left'] ) ) { $row_innner_html = '
' . $row_innner_html; } if ( isset( $no_cols['no-right'] ) ) { $row_innner_html .= '
'; } } if ( ! empty( $no_cols ) ) { $row_clases = array_merge( $row_clases, $no_cols ); } else { $row_clases[] = 'full-cols'; } $row_html = '
'; $row_html .= $row_innner_html; $row_html .= '
'; return $row_html; } public function render( $row_ids = array( 'top', 'main', 'bottom' ) ) { $setting = $this->get_settings(); $items = $this->render_items(); foreach ( $row_ids as $row_id ) { $show = starterblog_is_builder_row_display( $this->id, $row_id ); if ( $show && isset( $this->rows[ $row_id ] ) ) { $show_on_devices = $this->rows[ $row_id ]; if ( ! empty( $show_on_devices ) ) { $classes = array(); $_id = sprintf( '%1$s-%2$s', $this->id, $row_id ); $classes[] = $_id; $classes[] = $this->id . '--row'; $desktop_row = $this->get_row_settings( $row_id, 'desktop' ); $mobile_row = $this->get_row_settings( $row_id, 'mobile' ); $atts = array(); if ( ! empty( $desktop_row ) || ! empty( $mobile_row ) ) { $align_classes = 'starterblog-grid-middle'; if ( empty( $desktop_row ) ) { $classes[] = 'hide-on-desktop'; } if ( empty( $mobile_row ) ) { $classes[] = 'hide-on-mobile hide-on-tablet'; } $row_layout = StarterBlog()->get_setting( $this->id . '_' . $row_id . '_layout' ); $row_text_mode = StarterBlog()->get_setting( $this->id . '_' . $row_id . '_text_mode' ); if ( $row_layout ) { $classes[] = sanitize_text_field( $row_layout ); } $classes = apply_filters( 'starterblog/builder/row-classes', $classes, $row_id, $this ); $atts['class'] = join( ' ', $classes ); $atts['id'] = 'cb-row--' . $_id; $atts['data-row-id'] = $row_id; $atts = apply_filters( 'starterblog/builder/row-attrs', $atts, $row_id, $this ); $string_atts = ''; foreach ( $atts as $k => $s ) { if ( is_array( $s ) ) { $s = wp_json_encode( $s ); } $string_atts .= ' ' . sanitize_text_field( $k ) . '="' . esc_attr( $s ) . '" '; } if ( $desktop_row ) { $html_desktop = $this->render_row( $desktop_row, $row_id, 'desktop' ); } else { $html_desktop = false; } if ( $mobile_row ) { $html_mobile = $this->render_row( $mobile_row, $row_id, 'mobile' ); } else { $html_mobile = false; } // Row inner class. // Check if the row is header or footer. $inner_class = array(); if ( 'header' == $this->id ) { $inner_class[] = 'header--row-inner'; } else { $inner_class[] = 'footer--row-inner'; } $inner_class[] = $_id . '-inner'; if ( $row_text_mode ) { $inner_class['row_text_mode'] = $row_text_mode; } $inner_class = apply_filters( 'starterblog/builder/inner-row-classes', $inner_class, $row_id, $this ); if ( $html_mobile || $html_desktop ) { ?>
data-show-on="">
'; echo $html_desktop; echo '
'; } if ( $html_mobile ) { echo '
'; echo $html_mobile; echo '
'; } ?>
get_row_settings( $id, 'mobile' ); $menu_sidebar_skin = StarterBlog()->get_setting( 'header_sidebar_skin_mode' ); if ( ! is_array( $mobile_items ) ) { $mobile_items = array(); } if ( ! empty( $mobile_items ) || is_customize_preview() ) { $classes = array( 'header-menu-sidebar menu-sidebar-panel' ); if ( '' != $menu_sidebar_skin ) { $classes[] = $menu_sidebar_skin; } echo '
'; echo '
'; echo '
'; foreach ( $mobile_items as $row_id => $col_items ) { foreach ( $col_items as $item_index => $item ) { $item_id = $item['id']; $item = $this->get_render_item( $item_id ); $content = $item['content']; $item_config = isset( $this->config_items[ $item_id ] ) ? $this->config_items[ $item_id ] : array(); $item_config = wp_parse_args( $item_config, array( 'section' => '', 'name' => '', ) ); $classes = 'builder-item-sidebar mobile-item--' . $item_id; if ( strpos( $item_id, 'menu' ) ) { $classes = $classes . ' mobile-item--menu '; } $inner_classes = 'item--inner'; if ( is_customize_preview() ) { $inner_classes = $inner_classes . ' builder-item-focus '; } $content = $this->setup_item_content( $content, $id, 'mobile' ); echo '
'; echo '
'; echo $content; if ( is_customize_preview() ) { echo '' . esc_html( $item_config['name'] ) . ''; } echo '
'; echo '
'; } } echo '
'; echo '
'; echo '
'; } } } /** * Alias of class StarterBlog_Layout_Builder_Frontend_V2 * * @see StarterBlog_Layout_Builder_Frontend * * @return StarterBlog_Layout_Builder_Frontend_V2 */ function StarterBlog_Layout_Builder_Frontend_V2() { return StarterBlog_Layout_Builder_Frontend_V2::get_instance(); }