get_item_data_for('top-row'); $middle_row = $this->get_item_data_for('middle-row'); $bottom_row = $this->get_item_data_for('bottom-row'); $top_row_height = blocksy_akg('headerRowHeight', $top_row, [ 'mobile' => 50, 'tablet' => 50, 'desktop' => 50, ]); $middle_row_height = blocksy_akg('headerRowHeight', $middle_row, [ 'mobile' => 70, 'tablet' => 70, 'desktop' => 120, ]); $bottom_row_height = blocksy_akg('headerRowHeight', $bottom_row, [ 'mobile' => 80, 'tablet' => 80, 'desktop' => 80, ]); if ($sticky_height) { if ( $sticky_height['behaviour'] === 'middle' || $sticky_height['behaviour'] === 'middle_bottom' || $sticky_height['behaviour'] === 'bottom' ) { $top_row_height = [ 'mobile' => 0, 'tablet' => 0, 'desktop' => 0, ]; } if ( $sticky_height['behaviour'] === 'top' || $sticky_height['behaviour'] === 'bottom' ) { $middle_row_height = [ 'mobile' => 0, 'tablet' => 0, 'desktop' => 0, ]; } else { if ( blocksy_akg('has_sticky_shrink', $middle_row, 'no') === 'yes' && false ) { $middle_row_shrink = blocksy_expand_responsive_value(blocksy_akg( 'stickyHeaderRowShrink', $middle_row, 70 )); $middle_row_height = [ 'mobile' => intval($middle_row_shrink['mobile']) * intval($middle_row_height['mobile']) / 100, 'tablet' => intval($middle_row_shrink['tablet']) * intval($middle_row_height['tablet']) / 100, 'desktop' => intval($middle_row_shrink['desktop']) * intval($middle_row_height['desktop']) / 100, ]; } } if ( $sticky_height['behaviour'] === 'middle' || $sticky_height['behaviour'] === 'top_middle' || $sticky_height['behaviour'] === 'top' ) { $bottom_row_height = [ 'mobile' => 0, 'tablet' => 0, 'desktop' => 0, ]; } } $is_row_empty_mobile = $this->is_row_empty('top-row', 'mobile'); $is_row_empty_desktop = $this->is_row_empty('top-row', 'desktop'); if ($is_row_empty_mobile) { $top_row_height['mobile'] = 0; $top_row_height['tablet'] = 0; } if ($is_row_empty_desktop) { $top_row_height['desktop'] = 0; } $is_row_empty_mobile = $this->is_row_empty('middle-row', 'mobile'); $is_row_empty_desktop = $this->is_row_empty('middle-row', 'desktop'); if ($is_row_empty_mobile) { $middle_row_height['mobile'] = 0; $middle_row_height['tablet'] = 0; } if ($is_row_empty_desktop) { $middle_row_height['desktop'] = 0; } $is_row_empty_mobile = $this->is_row_empty('bottom-row', 'mobile'); $is_row_empty_desktop = $this->is_row_empty('bottom-row', 'desktop'); if ($is_row_empty_mobile) { $bottom_row_height['mobile'] = 0; $bottom_row_height['tablet'] = 0; } if ($is_row_empty_desktop) { $bottom_row_height['desktop'] = 0; } return [ 'mobile' => intval($top_row_height['mobile']) + intval( $middle_row_height['mobile'] ) + intval($bottom_row_height['mobile']), 'tablet' => intval($top_row_height['tablet']) + intval( $middle_row_height['tablet'] ) + intval($bottom_row_height['tablet']), 'desktop' => intval($top_row_height['desktop']) + intval( $middle_row_height['desktop'] ) + intval($bottom_row_height['desktop']), ]; } public function contains_item($item, $is_primary = false) { if (is_customize_preview() && ! wp_doing_ajax()) { // return true; } if ($is_primary) { return ( ! $this->is_row_empty($item, 'desktop') || ! $this->is_row_empty($item, 'mobile') ); } $section = $this->get_current_section(); foreach ($section['desktop'] as $desktop_row) { foreach ($desktop_row['placements'] as $single_placement) { if (in_array($item, $single_placement['items'])) { return true; } } } foreach ($section['mobile'] as $mobile_row) { foreach ($mobile_row['placements'] as $single_placement) { if (in_array($item, $single_placement['items'])) { return true; } } } return false; } public function render() { $content = $this->render_for_device('desktop'); $content .= $this->render_for_device('mobile'); $current_section = $this->get_current_section(); if (! isset($current_section['settings'])) { $current_section['settings'] = []; } $atts = $current_section['settings']; return blocksy_html_tag( 'header', apply_filters( 'blocksy:header:wrapper-attr', array_merge( [ 'id' => 'header', 'class' => 'ct-header', 'data-id' => $this->get_short_section_id(), ], blocksy_schema_org_definitions('header', ['array' => true]) ), [ 'atts' => $atts, 'current_section' => $current_section ] ), $content ); } public function render_for_device($device) { $rows = []; $current_section = $this->get_current_section(); $current_layout = $current_section[$device]; foreach ($current_layout as $row) { if ($row['id'] === 'offcanvas') { continue; } $rendered_row = $this->render_row($row, [ 'device' => $device ]); if (! empty(trim($rendered_row))) { $rows[$row['id']] = $rendered_row; } } $custom_content = apply_filters( 'blocksy:header:rows-render', null, $rows, $device ); if ($custom_content) { $content = $custom_content; } else { $content = implode('', array_values($rows)); } return blocksy_html_tag( 'div', apply_filters( 'blocksy:header:device-wrapper-attr', ['data-device' => $device], $device ), $content ); } public function render_row($row, $args = []) { $args = wp_parse_args($args, [ 'device' => 'desktop' ]); $row_config = $this->get_item_config_for($row['id']); $simplified_id = str_replace( '-row', '', $row['id'] ); $atts = $this->get_item_data_for($row['id']); $container_class = 'ct-container'; $headerRowWidth = blocksy_expand_responsive_value(blocksy_default_akg( 'headerRowWidth', $atts, 'fixed' ))[$args['device']]; if ($headerRowWidth === 'fluid') { $container_class = 'ct-container-fluid'; } $rendered_placements = [ 'start' => [ 'items' => [], 'rendered' => '' ], 'start-middle' => [ 'items' => [], 'rendered' => '' ], 'middle' => [ 'items' => [], 'rendered' => '' ], 'end-middle' => [ 'items' => [], 'rendered' => '' ], 'end' => [ 'items' => [], 'rendered' => '' ] ]; foreach ($row['placements'] as $placement) { $rendered_placements[$placement['id']] = $placement; $rendered_placements[ $placement['id'] ]['rendered'] = $this->render_items_collection( $placement['items'], [ 'device' => $args['device'] ] ); } $start_placement = $this->render_start_placement([ 'rendered_placements' => $rendered_placements, 'device' => $args['device'] ]); $middle_placement = $this->render_middle_placement([ 'rendered_placements' => $rendered_placements, 'device' => $args['device'] ]); $end_placement = $this->render_end_placement([ 'rendered_placements' => $rendered_placements, 'device' => $args['device'] ]); $count = 0; if (! empty(trim($start_placement))) { $count++; } if (! empty(trim($middle_placement))) { $count++; } if (! empty(trim($end_placement))) { $count++; } $attr = [ 'data-row' => $simplified_id, 'data-column-set' => $count, ]; if ($headerRowWidth === 'boxed') { $attr['data-row'] .= ':boxed'; } /* if ( $count === 2 && $this->should_column_be_expanded($row, 'start') ) { $attr['data-column-expand'] = 'left'; } if ( $count === 2 && $this->should_column_be_expanded($row, 'end') ) { $attr['data-column-expand'] = 'right'; } */ if ( $count === 3 && $this->should_column_be_expanded($rendered_placements, 'middle') ) { $attr['data-middle'] = 'search-input'; } $visibility_classes = blocksy_visibility_classes( blocksy_default_akg( 'headerRowVisibility', $atts, [ 'tablet' => true, 'mobile' => true, ] ) ); if (! empty($visibility_classes)) { $attr['class'] = $visibility_classes; } $row_container_attr = apply_filters( 'blocksy:header:row-wrapper-attr', array_merge($attr, ( is_customize_preview() ? [ 'data-item-label' => $row_config['config']['name'], 'data-shortcut' => 'border', 'data-shortcut-location' => $this->get_customizer_location_for( $row['id'] ), ] : [] )), $row, $args['device'] ); $row_content = $start_placement . $middle_placement . $end_placement; if ( empty($row_content) && blocksy_akg('render_empty_row', $atts, 'no') === 'no' ) { return ''; } $result = '
'; $result .= '
$container_class ])) . '>'; // $result .= '
'; $result .= $row_content; $result .= '
'; $result .= '
'; return $result; } public function render_single_item($item_id, $args = []) { $args = wp_parse_args($args, [ 'device' => 'desktop', 'render_args' => [] ]); $item = null; $row_id = null; foreach ($this->get_current_section()[$args['device']] as $row) { foreach ($row['placements'] as $single_placement) { if (in_array($item_id, $single_placement['items'])) { $row_id = $row['id']; } } } $registered_items = blocksy_manager()->builder->get_registered_items_by('header'); foreach ($registered_items as $single_item) { if ($single_item['id'] === $this->get_original_id($item_id)) { $item = $single_item; break; } } if (! $item) { return ''; } $render_args = apply_filters('blocksy:header:item-template-args', [ 'panel_type' => 'header', 'atts' => $this->get_item_data_for($item_id), 'section_id' => $this->get_current_section_id(), 'row_id' => $row_id, 'attr' => array_merge([ 'data-id' => $this->shorten_id($item_id), ], ( is_customize_preview() ? [ 'data-item-label' => $item['config']['name'], 'data-shortcut' => $item['config']['shortcut_style'], 'data-shortcut-location' => $this->get_customizer_location_for($item_id) ] : [] )), 'device' => $args['device'], 'render_args' => $args['render_args'], 'item_id' => $item_id ]); return blocksy_render_view( apply_filters( 'blocksy:header:item-view-path:' . $item_id, $item['path'] . '/view.php' ), $render_args ); } private function render_start_placement($args = []) { $args = wp_parse_args($args, [ 'rendered_placements' => null, 'device' => 'desktop' ]); if (! $args['rendered_placements']) { return ''; } // We will skip the start placement only in a few specific situations. if (empty($args['rendered_placements']['start']['rendered'])) { // Only middle is having some elements if ( empty($args['rendered_placements']['start-middle']['rendered']) && empty($args['rendered_placements']['end-middle']['rendered']) && empty($args['rendered_placements']['end']['rendered']) ) { return ''; } // Middle is empty. End may or may not be empty. if (empty($args['rendered_placements']['middle']['rendered'])) { return ''; } } $primary_output = ''; $secondary_output = ''; if (! empty($args['rendered_placements']['start']['rendered'])) { $primary_output = blocksy_html_tag( 'div', [ 'data-items' => 'primary' ], $args['rendered_placements']['start']['rendered'] ); } if ( ! empty($args['rendered_placements']['start-middle']['rendered']) && ! empty($args['rendered_placements']['middle']['rendered']) ) { $secondary_output = blocksy_html_tag( 'div', [ 'data-items' => 'secondary' ], $args['rendered_placements']['start-middle']['rendered'] ); } $count = 0; if (! empty(trim($primary_output))) { $count++; } if (! empty(trim($secondary_output))) { $count++; } $column_content = $primary_output . $secondary_output; return blocksy_html_tag( 'div', array_merge([ 'data-column' => 'start' ], ( $count > 0 ? [ 'data-placements' => $count ] : [] )), $primary_output . $secondary_output ); } private function render_middle_placement($args = []) { $args = wp_parse_args($args, [ 'rendered_placements' => null, 'device' => 'desktop' ]); if (! $args['rendered_placements']) { return ''; } if (empty($args['rendered_placements']['middle']['rendered'])) { return ''; } return blocksy_html_tag( 'div', ['data-column' => 'middle'], blocksy_html_tag( 'div', ['data-items' => ''], $args['rendered_placements']['middle']['rendered'] ) ); } private function render_end_placement($args = []) { $args = wp_parse_args($args, [ 'rendered_placements' => null, 'device' => 'desktop' ]); if (! $args['rendered_placements']) { return ''; } // We will skip the end placement only in a few specific situations. if (empty($args['rendered_placements']['end']['rendered'])) { // Only middle is having some elements if ( empty($args['rendered_placements']['end-middle']['rendered']) && empty($args['rendered_placements']['start-middle']['rendered']) && empty($args['rendered_placements']['start']['rendered']) ) { return ''; } // Middle is empty. End may or may not be empty. if (empty($args['rendered_placements']['middle']['rendered'])) { return ''; } } $primary_output = ''; $secondary_output = ''; if (! empty($args['rendered_placements']['end']['rendered'])) { $primary_output = blocksy_html_tag( 'div', [ 'data-items' => 'primary' ], $args['rendered_placements']['end']['rendered'] ); } if ( ! empty($args['rendered_placements']['end-middle']['rendered']) && ! empty($args['rendered_placements']['middle']['rendered']) ) { $secondary_output = blocksy_html_tag( 'div', [ 'data-items' => 'secondary' ], $args['rendered_placements']['end-middle']['rendered'] ); } $count = 0; if (! empty(trim($primary_output))) { $count++; } if (! empty(trim($secondary_output))) { $count++; } return blocksy_html_tag( 'div', array_merge([ 'data-column' => 'end' ], ( $count > 0 ? [ 'data-placements' => $count ] : [] )), $secondary_output . $primary_output ); } // It will only check for items being placed in the row. It won't check if // those items actually exist or return anything. public function is_row_empty($row, $device = '') { if (! is_array($row)) { $current_section = $this->get_current_section(); $current_layout = $current_section[$device]; foreach ($current_layout as $single_row) { if ($single_row['id'] === $row) { $row = $single_row; } } } if (! is_array($row)) { return true; } $columns_to_check = ['start', 'middle', 'end']; foreach ($row['placements'] as $single_column) { if ( in_array($single_column['id'], ['start', 'middle', 'end']) && isset($single_column['items']) && count($single_column['items']) > 0 ) { return false; } } $atts = $this->get_item_data_for($row['id']); if (blocksy_akg('render_empty_row', $atts, 'no') === 'yes') { return false; } return true; } public function render_items_collection($items, $args = []) { $args = wp_parse_args($args, [ 'device' => 'desktop' ]); $result = ''; foreach ($items as $item) { $result .= $this->render_single_item($item, [ 'device' => $args['device'] ]); } return $result; } public function get_primary_item($id) { return []; } public function should_column_be_expanded($rendered_placements, $placement) { $menus = [ 'menu', 'menu-secondary', 'menu-tertiary', ]; $items = $rendered_placements[$placement]['items']; if (in_array('search-input', $items)) { return true; } /* foreach ($menus as $menu_id) { if (! in_array($menu_id, $items)) { continue; } $atts = $this->get_item_data_for($menu_id); if (blocksy_default_akg('stretch_menu', $atts, 'no') === 'yes') { return true; } } */ return false; } }