File "menu.php"

Full Path: /www/wwwroot/shphe-en.com/wp-content/plugins/bb-plugin/modules/menu/menu.php
File size: 17.07 KB
MIME-type: --
Charset: utf-8

<?php

/**
 * @class FLMenuModule
 */
class FLMenuModule extends FLBuilderModule {

	/**
	 * @property $fl_builder_page_id
	 */
	public static $fl_builder_page_id;

	/** 
	 * @method __construct
	 */  
	public function __construct()
	{
		parent::__construct(array(
			'name'          	=> __('菜单', 'fl-builder'),
			'description'   	=> __('Renders a WordPress menu.', 'fl-builder'),
			'category'      	=> __('基本模块', 'fl-builder'),
			'partial_refresh'	=> true,
			'editor_export' 	=> false
		));
		
		add_action( 'pre_get_posts', 		__CLASS__ . '::set_pre_get_posts_query', 10, 2 );
		add_filter( 'nav_menu_css_class', 	__CLASS__ . '::render_menu_classes', 10, 2 );
	}

	public static function _get_menus(){
		$get_menus =  get_terms( 'nav_menu', array( 'hide_empty' => true ) );
		$fields = array(
		    'type'          => 'select',
		    'label'         => __( 'Menu', 'fl-builder' ),
		    'helper'		=> __( 'Select a WordPress menu that you created in the admin under Appearance > Menus.', 'fl-builder' )
		);
		
		if( $get_menus ){

			foreach( $get_menus as $key => $menu ){

				if( $key == 0 ){
					$fields['default'] = $menu->name;
				}

				$menus[ $menu->slug ] = $menu->name;
			}

			$fields['options'] = $menus;
			
		} else {
			$fields['options'] = array( '' => __( 'No Menus Found', 'fl-builder' ) );			
		}

		return $fields;

	}

	public function render_toggle_button(){
		
		$toggle = $this->settings->mobile_toggle;

		if( isset( $toggle ) && $toggle != 'expanded' ){

			if( in_array( $toggle, array( 'hamburger', 'hamburger-label' ) ) ){
	
				echo '<button class="fl-menu-mobile-toggle '. $toggle .'"><div class="svg-container">';
				include FL_BUILDER_DIR .'img/svg/hamburger-menu.svg';
				echo '</div>';

				if( $toggle == 'hamburger-label' ){
					echo '<span class="fl-menu-mobile-toggle-label">'. __( 'Menu', 'fl-builder' ) .'</span>';
				}

				echo '</button>';

			} elseif( $toggle == 'text' ){

				echo '<button class="fl-menu-mobile-toggle text"><span class="fl-menu-mobile-toggle-label">'. __( 'Menu', 'fl-builder' ) .'</span></button>';

			}

		}
	}

	public static function set_pre_get_posts_query( $query ) 
	{
	    if ( ! is_admin() && $query->is_main_query() ) {
	    	self::$fl_builder_page_id = $query->queried_object_id;
	    }
	    
	}

	public static function render_menu_classes( $classes = array(), $menu_item = false ) 
	{
		//Check if already have the class
	    if ( ! in_array( 'current-menu-item', $classes ) ) {
	    	
	    	//Check if a menu is the current page
	        if ( self::$fl_builder_page_id == $menu_item->object_id ) {
	        	$classes[] = 'current-menu-item';

	        	if ($menu_item->object == 'page') {
	        		$classes[] = 'current_page_item';
	        	}
	        }
	    }

	    return $classes;
	}
}

/**
 * Register the module and its form settings.
 */
FLBuilder::register_module('FLMenuModule', array(
	'general'       => array( // Tab
		'title'         => __('General', 'fl-builder'), // Tab title
		'sections'      => array( // Tab Sections
			'general'       => array( // Section
				'title'         => '', // Section Title
				'fields'        => array( // Section Fields
					'menu' => FLMenuModule::_get_menus(),
					'menu_layout' => array(
					    'type'          => 'select',
					    'label'         => __( 'Layout', 'fl-builder' ),
					    'default'       => 'horizontal',
					    'options'       => array(
					    	'horizontal'	=> __( 'Horizontal', 'fl-builder' ),
					    	'vertical'		=> __( 'Vertical', 'fl-builder' ),
					    	'accordion'		=> __( 'Accordion', 'fl-builder' ),
					    	'expanded'		=> __( 'Expanded', 'fl-builder' ),
					    ),
					    'toggle'		=> array(
					    	'horizontal'	=> array(
					    		'fields'		=> array( 'submenu_hover_toggle', 'menu_align' ),
					    	),
					    	'vertical'		=> array(
					    		'fields'		=> array( 'submenu_hover_toggle' ),
					    	),
					    	'accordion'		=> array(
					    		'fields'		=> array( 'submenu_click_toggle', 'collapse' ),
					    	),
					    )
					),
					'submenu_hover_toggle' => array(
					    'type'          => 'select',
					    'label'         => __( 'Submenu Icon', 'fl-builder' ),
					    'default'       => 'none',
					    'options'       => array(
					    	'arrows'		=> __( 'Arrows', 'fl-builder' ),
					    	'plus'			=> __( 'Plus sign', 'fl-builder' ),
					    	'none'			=> __( 'None', 'fl-builder' ),
					    )
					),
					'submenu_click_toggle' => array(
					    'type'          => 'select',
					    'label'         => __( 'Submenu Icon click', 'fl-builder' ),
					    'default'       => 'arrows',
					    'options'       => array(
					    	'arrows'		=> __( 'Arrows', 'fl-builder' ),
					    	'plus'			=> __( 'Plus sign', 'fl-builder' ),
					    )
					),
					'collapse'   => array(
						'type'          => 'select',
						'label'         => __('Collapse Inactive', 'fl-builder'),
						'default'       => '1',
						'options'       => array(
							'1'             => __('Yes', 'fl-builder'),
							'0'             => __('No', 'fl-builder')
						),
						'help'          => __('Choosing yes will keep only one item open at a time. Choosing no will allow multiple items to be open at the same time.', 'fl-builder'),
						'preview'       => array(
							'type'          => 'none'
						)
					),
					'mobile_toggle' => array(
					    'type'          => 'select',
					    'label'         => __( 'Mobile Style', 'fl-builder' ),
					    'default'       => 'expanded',
					    'options'       => array(
					    	'expanded'			=> __( 'Expanded', 'fl-builder' ),
					    	'hamburger'			=> __( 'Hamburger Icon', 'fl-builder' ),
					    	'hamburger-label'	=> __( 'Hamburger Icon + Label', 'fl-builder' ),
					    	'text'				=> __( 'Menu Button', 'fl-builder' ),
					    ),
					    'toggle'		=> array(
					    	'hamburger'	=> array(
					    		'fields'		=> array( 'mobile_full_width' ),
					    	),
					    	'hamburger-label'	=> array(
					    		'fields'		=> array( 'mobile_full_width' ),
					    	),
					    )				    
					),
					'mobile_full_width' => array(
					    'type'          => 'select',
					    'label'         => __( 'Mobile Width', 'fl-builder' ),
					    'help'			=> __( 'Choose Full Width if you want the menu to span the width of the screen on mobile devices.', 'fl-builder' ),
					    'default'       => 'no',
					    'options'       => array(
					    	'no'			=> __( 'Default', 'fl-builder' ),
					    	'yes'			=> __( 'Full Width', 'fl-builder' ),
					    ),
					    'toggle'		=> array(
					    	'yes'	=> array(
					    		'fields'		=> array( 'mobile_menu_bg' ),
					    	),
					    )				    
					),
				)
			)
		)
	),
	'style'         => array( // Tab
		'title'         => __('Style', 'fl-builder'), // Tab title
		'sections'      => array( // Tab Sections
			'general_style'    => array(
				'title'         => '',
				'fields'        => array(
					'menu_align' => array(
					    'type'          => 'select',
					    'label'         => __( 'Menu Alignment', 'fl-builder' ),
					    'default'       => 'default',
					    'options'       => array(
					    	'default'		=> __( 'Default', 'fl-builder' ),
					    	'left'			=> __( 'Left', 'fl-builder' ),
					    	'center'		=> __( 'Center', 'fl-builder' ),
					    	'right'			=> __( 'Right', 'fl-builder' ),
					    ),
					),
					'drop_shadow' => array(
					    'type'          => 'select',
					    'label'         => __( 'Submenu Drop Shadow', 'fl-builder' ),
					    'default'       => 'yes',
					    'options'       => array(
					    	'no'			=> __( 'No', 'fl-builder' ),
					    	'yes'			=> __( 'Yes', 'fl-builder' ),
					    )
					),
				)
			),
			'text_style'    => array(
				'title'         => __('Text', 'fl-builder'),
				'fields'        => array(
					'link_color'    => array(
						'type'          => 'color',
						'label'         => __('Link Color', 'fl-builder'),
						'show_reset'    => true,
					    'preview'      => array(
					        'type'         => 'css',
					        'rules'		   => array(
					        	array(
							        'selector'     => '.fl-menu a, .menu > li > a, .menu > li > .fl-has-submenu-container > a, .sub-menu > li > a',
							        'property'     => 'color'
					        	),
					        	array(
							        'selector'     => '.menu .fl-menu-toggle:before, .menu .fl-menu-toggle:after',
							        'property'     => 'border-color'
					        	),
					        )
					    )
					),
					'link_hover_color' => array(
						'type'          => 'color',
						'label'         => __('Link Hover Color', 'fl-builder'),
						'show_reset'    => true,
					    'preview'      => array(
					        'type'         => 'css',
					        'selector'     => '.fl-menu a, .menu > li.current-menu-item > a, .menu > li.current-menu-item > .fl-has-submenu-container > a, .sub-menu > li.current-menu-item > a',
					        'property'     => 'color'
					    )
					),
					'text_size' => array(
						'type'          => 'text',
						'label'         => __('Link Size', 'fl-builder'),
						'default'       => '13',
						'maxlength'     => '3',
						'size'          => '4',
						'description'   => 'px',
					    'preview'      => array(
					        'type'         => 'css',
					        'selector'     => '.menu',
					        'property'     => 'font-size',
					        'unit'		   => 'px'
					    )
					),
					'text_transform' => array(
					    'type'          => 'select',
					    'label'         => __( 'Link Format', 'fl-builder' ),
					    'default'       => 'none',
					    'options'       => array(
					    	'none'			=> __( 'None', 'fl-builder' ),
					    	'uppercase'		=> __( 'Uppercase', 'fl-builder' ),
					    	'lowercase'		=> __( 'Lowercase', 'fl-builder' ),
					    	'capitalize'	=> __( 'Capitalize', 'fl-builder' ),
					    ),
					    'preview'      => array(
					        'type'         => 'css',
					        'selector'     => '.menu',
					        'property'     => 'text-transform',
					    )					    
					),
					'font_weight' => array(
					    'type'          => 'select',
					    'label'         => __( 'Link Weight', 'fl-builder' ),
					    'default'       => 'normal',
					    'options'       => array(
					    	'normal'		=> __( 'Normal', 'fl-builder' ),
					    	'bold'			=> __( 'Bold', 'fl-builder' ),
					    	'light'			=> __( 'Light', 'fl-builder' ),
					    ),
					    'preview'      => array(
					        'type'         => 'css',
					        'selector'     => '.menu',
					        'property'     => 'font-weight',
					    )
					),
					'horizontal_spacing' => array(
						'type'          => 'text',
						'label'         => __('Horizontal Spacing', 'fl-builder'),
						'default'       => '10',
						'maxlength'     => '3',
						'size'          => '4',
						'description'   => 'px',
					    'preview'      => array(
					        'type'         => 'css',
					        'rules'		   => array(
					        	array(
							        'selector'     => '.menu a',
							        'property'     => 'padding-left',
							        'unit'		   => 'px',
					        	),
					        	array(
							        'selector'     => '.menu a',
							        'property'     => 'padding-right',
							        'unit'		   => 'px',
					        	),
					        )
					    )
					),
					'vertical_spacing' => array(
						'type'          => 'text',
						'label'         => __('Vertical Spacing', 'fl-builder'),
						'default'       => '10',
						'maxlength'     => '3',
						'size'          => '4',
						'description'   => 'px',					    
					    'preview'      => array(
					        'type'         => 'css',
					        'rules'		   => array(
					        	array(
							        'selector'     => '.menu a',
							        'property'     => 'padding-top',
							        'unit'		   => 'px',
					        	),
					        	array(
							        'selector'     => '.menu a',
							        'property'     => 'padding-bottom',
							        'unit'		   => 'px',
					        	),
					        )
					    )

					),
				)
			),
			'menu_style'    => array(
				'title'         => __('Backgrounds', 'fl-builder'),
				'fields'        => array(
					'menu_bg_color'   => array(
						'type'          => 'color',
						'label'         => __( 'Menu Background Color', 'fl-builder' ),
						'show_reset'    => true,
					    'preview'      => array(
					        'type'         => 'css',
					        'selector'     => '.menu',
					        'property'     => 'background-color'
					    )
					),
					'mobile_menu_bg'   => array(
						'type'          => 'color',
						'label'         => __( 'Menu Background Color (Mobile)', 'fl-builder' ),
						'show_reset'    => true,
					),
					'menu_bg_opacity' => array(
						'type'          => 'text',
						'label'         => __('Menu Background Opacity', 'fl-builder'),
						'default'       => '100',
						'maxlength'     => '3',
						'size'          => '4',
						'description'   => '%'
					),
					'submenu_bg_color' => array(
						'type'          => 'color',
						'label'         => __( 'Submenu Background Color', 'fl-builder' ),
						'show_reset'    => true,
						'default'		=> 'e3e3e3',
					    'preview'      => array(
					        'type'         => 'css',
					        'selector'     => '.fl-menu .sub-menu',
					        'property'     => 'background-color'
					    )
					),
					'submenu_bg_opacity' => array(
						'type'          => 'text',
						'label'         => __('Submenu Background Opacity', 'fl-builder'),
						'default'       => '100',
						'maxlength'     => '3',
						'size'          => '4',
						'description'   => '%'
					),

					'link_hover_bg_color' => array(
						'type'          => 'color',
						'label'         => __( 'Link Background Hover Color', 'fl-builder' ),
						'show_reset'    => true,
					    'preview'      => array(
					        'type'         => 'css',
					        'selector'     => '.menu > li.current-menu-item > a, .menu > li.current-menu-item > .fl-has-submenu-container > a, .sub-menu > li.current-menu-item > a, .sub-menu > li.current-menu-item > .fl-has-submenu-container > a',
					        'property'     => 'background-color'
					    )
					),
				)
			),
			'separator_style'    => array(
				'title'         => __('Separator', 'fl-builder'),
				'fields'        => array(
					'show_separator' => array(
					    'type'          => 'select',
					    'label'         => __( 'Show Separators', 'fl-builder' ),
					    'default'       => 'no',
					    'options'       => array(
					    	'no'			=> __( 'No', 'fl-builder' ),
					    	'yes'			=> __( 'Yes', 'fl-builder' ),
					    ),
					    'toggle'		=> array(
					    	'yes'			=> array(
					    		'fields'		=> array( 'separator_color', 'separator_opacity' ),
					    	)
					    ),
					),
					'separator_color'   => array(
						'type'          => 'color',
						'label'         => __('Separator Color', 'fl-builder'),
						'show_reset'    => true
					),
					'separator_opacity' => array(
						'type'          => 'text',
						'label'         => __('Separator Opacity', 'fl-builder'),
						'default'       => '100',
						'maxlength'     => '3',
						'size'          => '4',
						'description'   => '%'
					),
				)
			)
		)
	),
));


class FL_Menu_Module_Walker extends Walker_Nav_Menu {

    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {

        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $submenu = $args->has_children ? ' fl-has-submenu' : '';

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
        $class_names = ' class="' . esc_attr( $class_names ) . $submenu .'"';

        $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names . '>';

        $attributes = ! empty( $item->attr_title ) ? ' title="' . esc_attr( $item->attr_title ) .'"' : '';
        $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target ) .'"' : '';
        $attributes .= ! empty( $item->xfn ) ? ' rel="' . esc_attr( $item->xfn ) .'"' : '';
        $attributes .= ! empty( $item->url ) ? ' href="' . esc_attr( $item->url ) .'"' : '';

        $item_output = $args->has_children ? '<div class="fl-has-submenu-container">' : '';
        $item_output .= $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= !empty( $item->description ) ? '<small>' . $item->description . '</small>' : '';
        $item_output .= '</a>';

        if( $args->has_children ){
            $item_output .= '<span class="fl-menu-toggle"></span>';
        }

        $item_output .= $args->after;
        $item_output .= $args->has_children ? '</div>' : '';

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }

    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
        $id_field = $this->db_fields['id'];
        if ( is_object( $args[0] ) ) {
            $args[0]->has_children = ! empty( $children_elements[$element->$id_field] );
        }
        return parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }
}