PluginProbe
Polylang / 2.0.6
Polylang v2.0.6
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
polylang / include / widget-languages.php

widget-languages.php in Polylang 2.0.6, at include/widget-languages.php

153 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * The language switcher widget
5 *
6 * @since 0.1
7 */
8 class PLL_Widget_Languages extends WP_Widget {
9
10 /**
11 * Constructor
12 *
13 * @since 0.1
14 */
15 function __construct() {
16 parent::__construct(
17 'polylang',
18 __( 'Language Switcher', 'polylang' ),
19 array(
20 'description' => __( 'Displays a language switcher', 'polylang' ),
21 'customize_selective_refresh' => true,
22 )
23 );
24 }
25
26 /**
27 * Displays the widget
28 *
29 * @since 0.1
30 *
31 * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget.
32 * @param array $instance The settings for the particular instance of the widget
33 */
34 function widget( $args, $instance ) {
35 // Sets a unique id for dropdown
36 $instance['dropdown'] = empty( $instance['dropdown'] ) ? 0 : $args['widget_id'];
37
38 if ( $list = pll_the_languages( array_merge( $instance, array( 'echo' => 0 ) ) ) ) {
39 $title = empty( $instance['title'] ) ? '' : $instance['title'];
40 /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
41 $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
42
43 echo $args['before_widget'];
44 if ( $title ) {
45 echo $args['before_title'] . $title . $args['after_title'];
46 }
47 echo $instance['dropdown'] ? $list : "<ul>\n" . $list . "</ul>\n";
48 echo $args['after_widget'];
49 }
50 }
51
52 /**
53 * Updates the widget options
54 *
55 * @since 0.4
56 *
57 * @param array $new_instance New settings for this instance as input by the user via form()
58 * @param array $old_instance Old settings for this instance
59 * @return array Settings to save or bool false to cancel saving
60 */
61 function update( $new_instance, $old_instance ) {
62 $instance['title'] = strip_tags( $new_instance['title'] );
63 foreach ( array_keys( PLL_Switcher::get_switcher_options( 'widget' ) ) as $key ) {
64 $instance[ $key ] = ! empty( $new_instance[ $key ] ) ? 1 : 0;
65 }
66
67 return $instance;
68 }
69
70 /**
71 * Displays the widget form
72 *
73 * @since 0.4
74 *
75 * @param array $instance Current settings
76 */
77 function form( $instance ) {
78 // Default values
79 $instance = wp_parse_args( (array) $instance, array_merge( array( 'title' => '' ), PLL_Switcher::get_switcher_options( 'widget', 'default' ) ) );
80
81 // Title
82 printf(
83 '<p><label for="%1$s">%2$s</label><input class="widefat" id="%1$s" name="%3$s" type="text" value="%4$s" /></p>',
84 $this->get_field_id( 'title' ),
85 esc_html__( 'Title:', 'polylang' ),
86 $this->get_field_name( 'title' ),
87 esc_attr( $instance['title'] )
88 );
89
90 $fields = '';
91 foreach ( PLL_Switcher::get_switcher_options( 'widget' ) as $key => $str ) {
92 $fields .= sprintf(
93 '<div%5$s%6$s><input type="checkbox" class="checkbox %7$s" id="%1$s" name="%2$s"%3$s /><label for="%1$s">%4$s</label></div>',
94 $this->get_field_id( $key ),
95 $this->get_field_name( $key ),
96 $instance[ $key ] ? ' checked="checked"' : '',
97 esc_html( $str ),
98 in_array( $key, array( 'show_names', 'show_flags', 'hide_current' ) ) ? ' class="no-dropdown-' . $this->id . '"' : '',
99 ! empty( $instance['dropdown'] ) && in_array( $key, array( 'show_names', 'show_flags', 'hide_current' ) ) ? ' style="display:none;"' : '',
100 'pll-' . $key
101 );
102 }
103
104 echo $fields;
105
106 // FIXME echoing script in form is not very clean
107 // but it does not work if enqueued properly :
108 // clicking save on a widget makes this code unreachable for the just saved widget ( ?! )
109 $this->admin_print_script();
110 }
111
112 /**
113 * Add javascript to control the language switcher options
114 *
115 * @since 1.3
116 */
117 public function admin_print_script() {
118 static $done = false;
119
120 if ( $done ) {
121 return;
122 }
123
124 $done = true; ?>
125 <script type='text/javascript'>
126 //<![CDATA[
127 jQuery( document ).ready( function( $ ) {
128 function pll_toggle( a, test ) {
129 test ? a.show() : a.hide();
130 }
131
132 // Remove all options if dropdown is checked
133 $( '.widgets-sortables,.control-section-sidebar' ).on( 'change', '.pll-dropdown', function() {
134 var this_id = $( this ).parent().parent().parent().children( '.widget-id' ).attr( 'value' );
135 pll_toggle( $( '.no-dropdown-' + this_id ), 'checked' != $( this ).attr( 'checked' ) );
136 } );
137
138 // Disallow unchecking both show names and show flags
139 var options = ['-show_flags', '-show_names'];
140 $.each( options, function( i, v ) {
141 $( '.widgets-sortables,.control-section-sidebar' ).on( 'change', '.pll' + v, function() {
142 var this_id = $( this ).parent().parent().parent().children( '.widget-id' ).attr( 'value' );
143 if ( 'checked' != $( this ).attr( 'checked' ) ) {
144 $( '#widget-' + this_id + options[ 1-i ] ).prop( 'checked', true );
145 }
146 } );
147 } );
148 } );
149 //]]>
150 </script><?php
151 }
152 }
153