Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/elementor/includes/widgets/star-rating.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 + namespace Elementor;
3 +
4 + if ( ! defined( 'ABSPATH' ) ) {
5 + exit; // Exit if accessed directly.
6 + }
7 +
8 + use Elementor\Core\Kits\Documents\Tabs\Global_Colors;
9 + use Elementor\Core\Kits\Documents\Tabs\Global_Typography;
10 +
11 + /**
12 + * Elementor star rating widget.
13 + *
14 + * Elementor widget that displays star rating.
15 + *
16 + * @since 2.3.0
17 + */
18 + class Widget_Star_Rating extends Widget_Base {
19 +
20 + /**
21 + * Get widget name.
22 + *
23 + * Retrieve star rating widget name.
24 + *
25 + * @since 2.3.0
26 + * @access public
27 + *
28 + * @return string Widget name.
29 + */
30 + public function get_name() {
31 + return 'star-rating';
32 + }
33 +
34 + /**
35 + * Get widget title.
36 + *
37 + * Retrieve star rating widget title.
38 + *
39 + * @since 2.3.0
40 + * @access public
41 + *
42 + * @return string Widget title.
43 + */
44 + public function get_title() {
45 + return esc_html__( 'Star Rating', 'elementor' );
46 + }
47 +
48 + /**
49 + * Get widget icon.
50 + *
51 + * Retrieve star rating widget icon.
52 + *
53 + * @since 2.3.0
54 + * @access public
55 + *
56 + * @return string Widget icon.
57 + */
58 + public function get_icon() {
59 + return 'eicon-rating';
60 + }
61 +
62 + /**
63 + * Get widget keywords.
64 + *
65 + * Retrieve the list of keywords the widget belongs to.
66 + *
67 + * @since 2.3.0
68 + * @access public
69 + *
70 + * @return array Widget keywords.
71 + */
72 + public function get_keywords() {
73 + return [ 'star', 'rating', 'rate', 'review' ];
74 + }
75 +
76 + protected function is_dynamic_content(): bool {
77 + return false;
78 + }
79 +
80 + /**
81 + * Get style dependencies.
82 + *
83 + * Retrieve the list of style dependencies the widget requires.
84 + *
85 + * @since 3.24.0
86 + * @access public
87 + *
88 + * @return array Widget style dependencies.
89 + */
90 + public function get_style_depends(): array {
91 + return [ 'widget-star-rating' ];
92 + }
93 +
94 + /**
95 + * Hide widget from panel.
96 + *
97 + * Hide the star rating widget from the panel.
98 + *
99 + * @since 3.17.0
100 + * @return bool
101 + */
102 + public function show_in_panel(): bool {
103 + return false;
104 + }
105 +
106 + public function has_widget_inner_wrapper(): bool {
107 + return ! Plugin::$instance->experiments->is_feature_active( 'e_optimized_markup' );
108 + }
109 +
110 + /**
111 + * Register star rating widget controls.
112 + *
113 + * Adds different input fields to allow the user to change and customize the widget settings.
114 + *
115 + * @since 3.1.0
116 + * @access protected
117 + */
118 + protected function register_controls() {
119 + $this->start_controls_section(
120 + 'section_rating',
121 + [
122 + 'label' => esc_html__( 'Star Rating', 'elementor' ),
123 + ]
124 + );
125 +
126 + if ( Plugin::$instance->widgets_manager->get_widget_types( 'rating' ) ) {
127 + $this->add_deprecation_message(
128 + '3.17.0',
129 + esc_html__(
130 + 'You are currently editing a Star Rating widget in its old version. Drag a new Rating widget onto your page to use a newer version, providing better capabilities.',
131 + 'elementor'
132 + ),
133 + 'rating'
134 + );
135 + }
136 +
137 + $this->add_control(
138 + 'rating_scale',
139 + [
140 + 'label' => esc_html__( 'Rating Scale', 'elementor' ),
141 + 'type' => Controls_Manager::SELECT,
142 + 'options' => [
143 + '5' => '0-5',
144 + '10' => '0-10',
145 + ],
146 + 'default' => '5',
147 + ]
148 + );
149 +
150 + $this->add_control(
151 + 'rating',
152 + [
153 + 'label' => esc_html__( 'Rating', 'elementor' ),
154 + 'type' => Controls_Manager::NUMBER,
155 + 'min' => 0,
156 + 'max' => 10,
157 + 'step' => 0.1,
158 + 'default' => 5,
159 + 'dynamic' => [
160 + 'active' => true,
161 + ],
162 + ]
163 + );
164 +
165 + $this->add_control(
166 + 'star_style',
167 + [
168 + 'label' => esc_html__( 'Icon', 'elementor' ),
169 + 'type' => Controls_Manager::SELECT,
170 + 'options' => [
171 + 'star_fontawesome' => 'Font Awesome',
172 + 'star_unicode' => 'Unicode',
173 + ],
174 + 'default' => 'star_fontawesome',
175 + 'render_type' => 'template',
176 + 'prefix_class' => 'elementor--star-style-',
177 + 'separator' => 'before',
178 + ]
179 + );
180 +
181 + $this->add_control(
182 + 'unmarked_star_style',
183 + [
184 + 'label' => esc_html__( 'Unmarked Style', 'elementor' ),
185 + 'type' => Controls_Manager::CHOOSE,
186 + 'options' => [
187 + 'solid' => [
188 + 'title' => esc_html__( 'Solid', 'elementor' ),
189 + 'icon' => 'eicon-star',
190 + ],
191 + 'outline' => [
192 + 'title' => esc_html__( 'Outline', 'elementor' ),
193 + 'icon' => 'eicon-star-o',
194 + ],
195 + ],
196 + 'default' => 'solid',
197 + ]
198 + );
199 +
200 + $this->add_control(
201 + 'title',
202 + [
203 + 'label' => esc_html__( 'Title', 'elementor' ),
204 + 'type' => Controls_Manager::TEXT,
205 + 'separator' => 'before',
206 + 'dynamic' => [
207 + 'active' => true,
208 + ],
209 + ]
210 + );
211 +
212 + $this->add_responsive_control(
213 + 'align',
214 + [
215 + 'label' => esc_html__( 'Alignment', 'elementor' ),
216 + 'type' => Controls_Manager::CHOOSE,
217 + 'options' => [
218 + 'start' => [
219 + 'title' => esc_html__( 'Start', 'elementor' ),
220 + 'icon' => 'eicon-text-align-left',
221 + ],
222 + 'center' => [
223 + 'title' => esc_html__( 'Center', 'elementor' ),
224 + 'icon' => 'eicon-text-align-center',
225 + ],
226 + 'end' => [
227 + 'title' => esc_html__( 'End', 'elementor' ),
228 + 'icon' => 'eicon-text-align-right',
229 + ],
230 + 'justify' => [
231 + 'title' => esc_html__( 'Justified', 'elementor' ),
232 + 'icon' => 'eicon-text-align-justify',
233 + ],
234 + ],
235 + 'classes' => 'elementor-control-start-end',
236 + 'classes_dictionary' => [
237 + 'left' => is_rtl() ? 'end' : 'start',
238 + 'right' => is_rtl() ? 'start' : 'end',
239 + ],
240 + 'selectors_dictionary' => [
241 + 'left' => is_rtl() ? 'end' : 'start',
242 + 'right' => is_rtl() ? 'start' : 'end',
243 + ],
244 + 'prefix_class' => 'elementor-star-rating%s--align-',
245 + 'selectors' => [
246 + '{{WRAPPER}}' => 'text-align: {{VALUE}}',
247 + ],
248 + ]
249 + );
250 +
251 + $this->end_controls_section();
252 +
253 + $this->start_controls_section(
254 + 'section_title_style',
255 + [
256 + 'label' => esc_html__( 'Title', 'elementor' ),
257 + 'tab' => Controls_Manager::TAB_STYLE,
258 + 'condition' => [
259 + 'title!' => '',
260 + ],
261 + ]
262 + );
263 +
264 + $this->add_control(
265 + 'title_color',
266 + [
267 + 'label' => esc_html__( 'Text Color', 'elementor' ),
268 + 'type' => Controls_Manager::COLOR,
269 + 'global' => [
270 + 'default' => Global_Colors::COLOR_TEXT,
271 + ],
272 + 'selectors' => [
273 + '{{WRAPPER}} .elementor-star-rating__title' => 'color: {{VALUE}}',
274 + ],
275 + ]
276 + );
277 +
278 + $this->add_group_control(
279 + Group_Control_Typography::get_type(),
280 + [
281 + 'name' => 'title_typography',
282 + 'selector' => '{{WRAPPER}} .elementor-star-rating__title',
283 + 'global' => [
284 + 'default' => Global_Typography::TYPOGRAPHY_TEXT,
285 + ],
286 + ]
287 + );
288 +
289 + $this->add_group_control(
290 + Group_Control_Text_Shadow::get_type(),
291 + [
292 + 'name' => 'title_shadow',
293 + 'selector' => '{{WRAPPER}} .elementor-star-rating__title',
294 + ]
295 + );
296 +
297 + $this->add_responsive_control(
298 + 'title_gap',
299 + [
300 + 'label' => esc_html__( 'Gap', 'elementor' ),
301 + 'type' => Controls_Manager::SLIDER,
302 + 'size_units' => [ 'px', 'em', 'rem', 'custom' ],
303 + 'range' => [
304 + 'px' => [
305 + 'max' => 50,
306 + ],
307 + 'em' => [
308 + 'min' => 0,
309 + 'max' => 5,
310 + ],
311 + 'rem' => [
312 + 'min' => 0,
313 + 'max' => 5,
314 + ],
315 + ],
316 + 'selectors' => [
317 + '{{WRAPPER}}:not(.elementor-star-rating--align-justify) .elementor-star-rating__title' => 'margin-inline-end: {{SIZE}}{{UNIT}}',
318 + ],
319 + ]
320 + );
321 +
322 + $this->end_controls_section();
323 +
324 + $this->start_controls_section(
325 + 'section_stars_style',
326 + [
327 + 'label' => esc_html__( 'Stars', 'elementor' ),
328 + 'tab' => Controls_Manager::TAB_STYLE,
329 + ]
330 + );
331 +
332 + $this->add_responsive_control(
333 + 'icon_size',
334 + [
335 + 'label' => esc_html__( 'Size', 'elementor' ),
336 + 'type' => Controls_Manager::SLIDER,
337 + 'size_units' => [ 'px', 'em', 'rem', 'custom' ],
338 + 'range' => [
339 + 'px' => [
340 + 'max' => 100,
341 + ],
342 + 'em' => [
343 + 'min' => 0,
344 + 'max' => 10,
345 + ],
346 + 'rem' => [
347 + 'min' => 0,
348 + 'max' => 10,
349 + ],
350 + ],
351 + 'selectors' => [
352 + '{{WRAPPER}} .elementor-star-rating' => 'font-size: {{SIZE}}{{UNIT}}',
353 + ],
354 + ]
355 + );
356 +
357 + $this->add_responsive_control(
358 + 'icon_space',
359 + [
360 + 'label' => esc_html__( 'Spacing', 'elementor' ),
361 + 'type' => Controls_Manager::SLIDER,
362 + 'size_units' => [ 'px', 'em', 'rem', 'custom' ],
363 + 'range' => [
364 + 'px' => [
365 + 'max' => 50,
366 + ],
367 + 'em' => [
368 + 'min' => 0,
369 + 'max' => 5,
370 + ],
371 + 'rem' => [
372 + 'min' => 0,
373 + 'max' => 5,
374 + ],
375 + ],
376 + 'selectors' => [
377 + '{{WRAPPER}} .elementor-star-rating i:not(:last-of-type)' => 'margin-inline-end: {{SIZE}}{{UNIT}}',
378 + ],
379 + ]
380 + );
381 +
382 + $this->add_control(
383 + 'stars_color',
384 + [
385 + 'label' => esc_html__( 'Color', 'elementor' ),
386 + 'type' => Controls_Manager::COLOR,
387 + 'selectors' => [
388 + '{{WRAPPER}} .elementor-star-rating i:before' => 'color: {{VALUE}}',
389 + ],
390 + 'separator' => 'before',
391 + ]
392 + );
393 +
394 + $this->add_control(
395 + 'stars_unmarked_color',
396 + [
397 + 'label' => esc_html__( 'Unmarked Color', 'elementor' ),
398 + 'type' => Controls_Manager::COLOR,
399 + 'selectors' => [
400 + '{{WRAPPER}} .elementor-star-rating i' => 'color: {{VALUE}}',
401 + ],
402 + ]
403 + );
404 +
405 + $this->end_controls_section();
406 + }
407 +
408 + /**
409 + * @since 2.3.0
410 + * @access protected
411 + */
412 + protected function get_rating() {
413 + $settings = $this->get_settings_for_display();
414 + $rating_scale = (int) $settings['rating_scale'];
415 + $rating = min( (float) $settings['rating'], $rating_scale );
416 +
417 + return [ $rating, $rating_scale ];
418 + }
419 +
420 + /**
421 + * Print the actual stars and calculate their filling.
422 + *
423 + * Rating type is float to allow stars-count to be a fraction.
424 + * Floored-rating type is int, to represent the rounded-down stars count.
425 + * In the `for` loop, the index type is float to allow comparing with the rating value.
426 + *
427 + * @since 2.3.0
428 + * @access protected
429 + */
430 + protected function render_stars( $icon ) {
431 + $rating_data = $this->get_rating();
432 + $rating = (float) $rating_data[0];
433 + $floored_rating = floor( $rating );
434 + $stars_html = '';
435 +
436 + for ( $stars = 1.0; $stars <= $rating_data[1]; $stars++ ) {
437 + if ( $stars <= $floored_rating ) {
438 + $stars_html .= '<i class="elementor-star-full" aria-hidden="true">' . $icon . '</i>';
439 + } elseif ( $floored_rating + 1 === $stars && $rating !== $floored_rating ) {
440 + $stars_html .= '<i class="elementor-star-' . ( $rating - $floored_rating ) * 10 . '" aria-hidden="true">' . $icon . '</i>';
441 + } else {
442 + $stars_html .= '<i class="elementor-star-empty" aria-hidden="true">' . $icon . '</i>';
443 + }
444 + }
445 +
446 + Utils::print_unescaped_internal_string( $stars_html );
447 + }
448 +
449 + /**
450 + * @since 2.3.0
451 + * @access protected
452 + */
453 + protected function render() {
454 + $settings = $this->get_settings_for_display();
455 + $rating_data = $this->get_rating();
456 + $textual_rating = sprintf(
457 + /* translators: 1: Rating value. 2: Rating scale. */
458 + esc_html__( 'Rated %1$s out of %2$s', 'elementor' ),
459 + $rating_data[0],
460 + $rating_data[1]
461 + );
462 + $icon = '&#xE934;';
463 +
464 + if ( 'star_fontawesome' === $settings['star_style'] ) {
465 + if ( 'outline' === $settings['unmarked_star_style'] ) {
466 + $icon = '&#xE933;';
467 + }
468 + } elseif ( 'star_unicode' === $settings['star_style'] ) {
469 + $icon = '&#9733;';
470 +
471 + if ( 'outline' === $settings['unmarked_star_style'] ) {
472 + $icon = '&#9734;';
473 + }
474 + }
475 +
476 + $this->add_render_attribute( 'icon_wrapper', [
477 + 'class' => 'elementor-star-rating',
478 + 'itemtype' => 'http://schema.org/Rating',
479 + 'itemscope' => '',
480 + 'itemprop' => 'reviewRating',
481 + ] );
482 + ?>
483 + <div class="elementor-star-rating__wrapper">
484 + <?php if ( ! Utils::is_empty( $settings['title'] ) ) : ?>
485 + <div class="elementor-star-rating__title"><?php echo esc_html( $settings['title'] ); ?></div>
486 + <?php endif; ?>
487 + <div <?php $this->print_render_attribute_string( 'icon_wrapper' ); ?>>
488 + <?php $this->render_stars( $icon ); ?>
489 + <span itemprop="ratingValue" class="elementor-screen-only"><?php echo esc_html( $textual_rating ); ?></span>
490 + </div>
491 + </div>
492 + <?php
493 + }
494 +
495 + /**
496 + * @since 2.9.0
497 + * @access protected
498 + */
499 + protected function content_template() {
500 + ?>
501 + <#
502 + var getRating = function() {
503 + var ratingScale = parseInt( settings.rating_scale, 10 ),
504 + rating = settings.rating > ratingScale ? ratingScale : settings.rating;
505 +
506 + return [ rating, ratingScale ];
507 + },
508 + ratingData = getRating(),
509 + rating = ratingData[0],
510 + textualRating = 'Rated ' + ratingData[0] + ' out of ' + ratingData[1],
511 + renderStars = function( icon ) {
512 + var starsHtml = '',
513 + flooredRating = Math.floor( rating );
514 +
515 + for ( var stars = 1; stars <= ratingData[1]; stars++ ) {
516 + if ( stars <= flooredRating ) {
517 + starsHtml += '<i class="elementor-star-full" aria-hidden="true">' + icon + '</i>';
518 + } else if ( flooredRating + 1 === stars && rating !== flooredRating ) {
519 + starsHtml += '<i class="elementor-star-' + ( rating - flooredRating ).toFixed( 1 ) * 10 + '" aria-hidden="true">' + icon + '</i>';
520 + } else {
521 + starsHtml += '<i class="elementor-star-empty" aria-hidden="true">' + icon + '</i>';
522 + }
523 + }
524 +
525 + return starsHtml;
526 + },
527 + icon = '&#xE934;';
528 +
529 + if ( 'star_fontawesome' === settings.star_style ) {
530 + if ( 'outline' === settings.unmarked_star_style ) {
531 + icon = '&#xE933;';
532 + }
533 + } else if ( 'star_unicode' === settings.star_style ) {
534 + icon = '&#9733;';
535 +
536 + if ( 'outline' === settings.unmarked_star_style ) {
537 + icon = '&#9734;';
538 + }
539 + }
540 +
541 + view.addRenderAttribute( 'iconWrapper', 'class', 'elementor-star-rating' );
542 + view.addRenderAttribute( 'iconWrapper', 'itemtype', 'http://schema.org/Rating' );
543 + view.addRenderAttribute( 'iconWrapper', 'itemscope', '' );
544 + view.addRenderAttribute( 'iconWrapper', 'itemprop', 'reviewRating' );
545 +
546 + var stars = renderStars( icon );
547 + #>
548 + <div class="elementor-star-rating__wrapper">
549 + <# if ( ! _.isEmpty( settings.title ) ) { #>
550 + <div class="elementor-star-rating__title">{{ settings.title }}</div>
551 + <# } #>
552 + <div {{{ view.getRenderAttributeString( 'iconWrapper' ) }}} >
553 + {{{ stars }}}
554 + <span itemprop="ratingValue" class="elementor-screen-only">{{ textualRating }}</span>
555 + </div>
556 + </div>
557 + <?php
558 + }
559 + }
560 +