PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.1
Elementor Website Builder – more than just a page builder v4.3.1
4.3.1 4.3.0 4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 All 454 releases
elementor / modules / atomic-widgets / elements / atomic-self-hosted-video / atomic-self-hosted-video.php

atomic-self-hosted-video.php in Elementor Website Builder – more than just a page builder 4.3.1, at modules/atomic-widgets/elements/atomic-self-hosted-video/atomic-self-hosted-video.php

216 lines 7.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Modules\AtomicWidgets\Elements\Atomic_Self_Hosted_Video;
4
5 use Elementor\Modules\AtomicWidgets\Controls\Section;
6 use Elementor\Modules\AtomicWidgets\Controls\Types\Image_Control;
7 use Elementor\Modules\AtomicWidgets\Controls\Types\Number_Control;
8 use Elementor\Modules\AtomicWidgets\Controls\Types\Select_Control;
9 use Elementor\Modules\AtomicWidgets\Controls\Types\Switch_Control;
10 use Elementor\Modules\AtomicWidgets\Controls\Types\Text_Control;
11 use Elementor\Modules\AtomicWidgets\Controls\Types\Video_Control;
12 use Elementor\Modules\AtomicWidgets\DynamicTags\Dynamic_Prop_Type;
13 use Elementor\Modules\AtomicWidgets\Elements\Base\Atomic_Widget_Base;
14 use Elementor\Modules\AtomicWidgets\Elements\Base\Has_Template;
15 use Elementor\Modules\AtomicWidgets\Elements\Base\Html_Tag_Computer;
16 use Elementor\Modules\AtomicWidgets\PropDependencies\Manager as Dependency_Manager;
17 use Elementor\Modules\AtomicWidgets\PropTypes\Attributes_Prop_Type;
18 use Elementor\Modules\AtomicWidgets\PropTypes\Classes_Prop_Type;
19 use Elementor\Modules\AtomicWidgets\PropTypes\Image_Prop_Type;
20 use Elementor\Modules\AtomicWidgets\PropTypes\Primitives\Boolean_Prop_Type;
21 use Elementor\Modules\AtomicWidgets\PropTypes\Primitives\Number_Prop_Type;
22 use Elementor\Modules\AtomicWidgets\PropTypes\Primitives\String_Prop_Type;
23 use Elementor\Modules\AtomicWidgets\PropTypes\Size_Prop_Type;
24 use Elementor\Modules\AtomicWidgets\PropTypes\Video_Src_Prop_Type;
25 use Elementor\Modules\AtomicWidgets\Styles\Style_Definition;
26 use Elementor\Modules\AtomicWidgets\Styles\Style_Variant;
27 use Elementor\Modules\AtomicWidgets\Utils\Image\Placeholder_Image;
28 use Elementor\Modules\Components\PropTypes\Overridable_Prop_Type;
29
30 if ( ! defined( 'ABSPATH' ) ) {
31 exit;
32 }
33
34 class Atomic_Self_Hosted_Video extends Atomic_Widget_Base {
35
36 use Has_Template;
37
38 protected static function get_preload_options() {
39 return [
40 'auto' => esc_html__( 'Auto', 'elementor' ),
41 'metadata' => esc_html__( 'Metadata', 'elementor' ),
42 'none' => esc_html__( 'None (Lazy Load)', 'elementor' ),
43 ]; }
44
45 protected function get_css_id_control_meta(): array {
46 return [
47 'layout' => 'two-columns',
48 'topDivider' => false,
49 ];
50 }
51
52 public static function get_element_type(): string {
53 return 'e-self-hosted-video';
54 }
55
56 public function get_title() {
57 return esc_html__( 'Video', 'elementor' );
58 }
59
60 public function get_keywords() {
61 return [ 'ato', 'atom', 'atoms', 'atomic', 'video', 'player', 'media', 'hosted' ];
62 }
63
64 public function get_icon() {
65 return 'eicon-video';
66 }
67
68 public static function get_computed_html_tag( array $settings ): string {
69 return Html_Tag_Computer::compute( $settings, 'video' );
70 }
71
72 protected static function define_props_schema(): array {
73 $playsinline_dependencies = Dependency_Manager::make()
74 ->where([
75 'operator' => 'eq',
76 'path' => [ 'autoplay' ],
77 'value' => true,
78 'effect' => 'hide',
79 ])
80 ->get();
81
82 // NOTE: restore the dependency when dependencies works in overridables
83 $poster_dependencies = Dependency_Manager::make()
84 ->where([
85 'operator' => 'eq',
86 'path' => [ 'poster_enabled' ],
87 'value' => true,
88 'effect' => 'hide',
89 ])
90 ->get();
91
92 $allow_download_dependencies = Dependency_Manager::make()
93 ->where([
94 'operator' => 'eq',
95 'path' => [ 'controls' ],
96 'value' => true,
97 'effect' => 'hide',
98 ])
99 ->get();
100
101 return [
102 'classes' => Classes_Prop_Type::make()
103 ->default( [] ),
104 'source' => Video_Src_Prop_Type::make()
105 ->alias( 'video', 'src' ),
106 'autoplay' => Boolean_Prop_Type::make()->default( false ),
107 'playsinline' => Boolean_Prop_Type::make()
108 ->default( false )
109 ->set_dependencies( $playsinline_dependencies )
110 ->meta( Overridable_Prop_Type::ignore() ),
111 'mute' => Boolean_Prop_Type::make()->default( false ),
112 'loop' => Boolean_Prop_Type::make()->default( false ),
113 'controls' => Boolean_Prop_Type::make()->default( true ),
114 'preload' => String_Prop_Type::make()
115 ->default( 'metadata' )
116 ->enum( array_keys( self::get_preload_options() ) ),
117 'download' => Boolean_Prop_Type::make()->default( false )
118 ->set_dependencies( $allow_download_dependencies ),
119 'start_time' => Number_Prop_Type::make()
120 ->default( null )
121 ->meta( Dynamic_Prop_Type::ignore() )
122 ->meta( 'suffix', 'SEC' ),
123 'end_time' => Number_Prop_Type::make()
124 ->default( null )
125 ->meta( 'suffix', 'SEC' )
126 ->meta( Dynamic_Prop_Type::ignore() ),
127 'poster_enabled' => Boolean_Prop_Type::make()->default( false ),
128 'poster' => Image_Prop_Type::make()
129 ->default_size( 'medium_large' )
130 ->default_url( Placeholder_Image::get_placeholder_image() ),
131 // TODO: restore the dependency when dependencies works in overridables
132 // ->set_dependencies( $poster_dependencies ),
133 'attributes' => Attributes_Prop_Type::make()->meta( Overridable_Prop_Type::ignore() ),
134 ];
135 }
136
137 protected function define_atomic_controls(): array {
138 return [
139 Section::make()
140 ->set_label( __( 'Content', 'elementor' ) )
141 ->set_id( 'content' )
142 ->set_items([
143 Video_Control::bind_to( 'source' )
144 ->set_label( esc_html__( 'Video', 'elementor' ) ),
145 Number_Control::bind_to( 'start_time' )
146 ->set_label( esc_html__( 'Start Time', 'elementor' ) )
147 ->set_min( 0 )
148 ->set_max( 10000 ),
149 Number_Control::bind_to( 'end_time' )
150 ->set_label( esc_html__( 'End Time', 'elementor' ) )
151 ->set_min( 0 )
152 ->set_max( 10000 ),
153 Switch_Control::bind_to( 'autoplay' )->set_label( esc_html__( 'Autoplay', 'elementor' ) ),
154 Switch_Control::bind_to( 'playsinline' )
155 ->set_label( esc_html__( 'Play on mobile', 'elementor' ) ),
156 Switch_Control::bind_to( 'mute' )->set_label( esc_html__( 'Mute', 'elementor' ) ),
157 Switch_Control::bind_to( 'loop' )->set_label( esc_html__( 'Loop', 'elementor' ) ),
158 Switch_Control::bind_to( 'controls' )->set_label( esc_html__( 'Player Controls', 'elementor' ) ),
159 Switch_Control::bind_to( 'download' )->set_label( esc_html__( 'Allow Download', 'elementor' ) ),
160 Select_Control::bind_to( 'preload' )
161 ->set_label( esc_html__( 'Preload', 'elementor' ) )
162 ->set_options( self::format_options( self::get_preload_options() ) ),
163 Switch_Control::bind_to( 'poster_enabled' )
164 ->set_label( esc_html__( 'Poster Image', 'elementor' ) ),
165 Image_Control::bind_to( 'poster' )
166 ->set_label( esc_html__( 'Image', 'elementor' ) ),
167 ]),
168 Section::make()
169 ->set_label( __( 'Settings', 'elementor' ) )
170 ->set_id( 'settings' )
171 ->set_items( $this->get_settings_controls() ),
172 ];
173 }
174
175 protected function get_settings_controls(): array {
176 return [
177 Text_Control::bind_to( '_cssid' )
178 ->set_label( __( 'ID', 'elementor' ) )
179 ->set_meta( $this->get_css_id_control_meta() ),
180 ];
181 }
182
183 protected function define_base_styles(): array {
184 $max_width = Size_Prop_Type::generate([
185 'unit' => 'vw',
186 'size' => 100,
187 ]);
188 return [
189 'base' => Style_Definition::make()
190 ->add_variant(
191 Style_Variant::make()
192 ->add_prop( 'max-width', $max_width )
193 ->add_prop( 'display', String_Prop_Type::generate( 'inline-block' ) )
194 ->add_prop( 'aspect-ratio', String_Prop_Type::generate( '16/9' ) )
195 ),
196 ];
197 }
198
199 protected function get_templates(): array {
200 return [
201 'elementor/elements/atomic-self-hosted-video' => __DIR__ . '/atomic-self-hosted-video.html.twig',
202 ];
203 }
204
205 private static function format_options( array $options ): array {
206 return array_map(
207 fn( $value, $key ) => [
208 'value' => $key,
209 'label' => $value,
210 ],
211 $options,
212 array_keys( $options )
213 );
214 }
215 }
216