PluginProbe
Boxzilla – WordPress Popup Builder / 3.4.8
Boxzilla – WordPress Popup Builder v3.4.8
3.4.11 3.4.10 3.4.9 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 trunk 3.0 3.0.1 3.0.2 3.0.3 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 All 72 releases
boxzilla / src / class-box.php

class-box.php in Boxzilla – WordPress Popup Builder 3.4.8, at src/class-box.php

273 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Boxzilla;
4
5 use WP_Post;
6
7 class Box
8 {
9 /**
10 * @var int
11 */
12 public $ID;
13
14 /**
15 * @var array
16 */
17 public $options = [];
18
19 /**
20 * @var string
21 */
22 public $title = '';
23
24 /**
25 * @var string
26 */
27 protected $content = '';
28
29 /**
30 * @var bool
31 */
32 public $enabled = false;
33
34 /**
35 * @var WP_Post
36 */
37 private $post;
38
39 /**
40 * @param WP_Post|int $post
41 */
42 public function __construct($post)
43 {
44 // fetch post if it hasn't been fetched yet
45 if (! $post instanceof WP_Post) {
46 $post_id = $post;
47 $post = get_post($post_id);
48
49 if ($post === null) {
50 throw new \InvalidArgumentException('No post found with ID ' . $post_id);
51 }
52 }
53
54 // store ref to post
55 $this->post = $post;
56
57 // store ID in property for quick access
58 $this->ID = $post->ID;
59
60 // store title in property
61 $this->title = $post->post_title;
62
63 // store content in property
64 $this->content = $post->post_content;
65
66 // is this box enabled?
67 $this->enabled = $post->post_status === 'publish';
68
69 // load and store options in property
70 $this->options = $this->load_options();
71 }
72
73 /**
74 * Get the options for this box.
75 **
76 * @return array Array of box options
77 */
78 protected function load_options()
79 {
80 $defaults = [
81 'css' => [
82 'background_color' => '',
83 'color' => '',
84 'width' => '',
85 'border_color' => '',
86 'border_width' => '',
87 'border_style' => '',
88 'position' => 'bottom-right',
89 ],
90 'rules' => [
91 0 => [
92 'condition' => '',
93 'value' => '',
94 ],
95 ],
96 'rules_comparision' => 'any',
97 'cookie' => [
98 'triggered' => 0,
99 'dismissed' => 0,
100 ],
101 'trigger' => 'percentage',
102 'trigger_percentage' => 65,
103 'trigger_element' => '',
104 'trigger_time_on_site' => 0,
105 'trigger_time_on_page' => 0,
106 'animation' => 'fade',
107 'auto_hide' => 0,
108 'screen_size_condition' => [
109 'condition' => 'larger',
110 'value' => 0,
111 ],
112 'closable' => 1,
113 'show_close_icon' => 1,
114 ];
115 $box = $this;
116
117 $options = get_post_meta($this->ID, 'boxzilla_options', true);
118 $options = is_array($options) ? $options : [];
119
120 // merge options with default options
121 $options = array_replace_recursive($defaults, $options);
122
123 // allow others to filter the final array of options
124 /**
125 * Filter the options for a given box
126 *
127 * @param array $options
128 * @param Box $box
129 */
130 $options = apply_filters('boxzilla_box_options', $options, $box);
131
132 return $options;
133 }
134
135 /**
136 * @return bool
137 */
138 public function is_enabled()
139 {
140 return $this->enabled;
141 }
142
143 /**
144 * Get the options for this box
145 *
146 * @return array
147 */
148 public function get_options()
149 {
150 return $this->options;
151 }
152
153 /**
154 * Get the close / hide icon for this box
155 *
156 * @return string
157 */
158 public function get_close_icon()
159 {
160 if (! $this->options['show_close_icon']) {
161 return '';
162 }
163
164 $box = $this;
165 $html = '&times;';
166
167 /**
168 * Filters the HTML for the close icon.
169 *
170 * @param string $html
171 * @param Box $box
172 */
173 $close_icon = (string) apply_filters('boxzilla_box_close_icon', $html, $box);
174
175 return $close_icon;
176 }
177
178 /**
179 * Get the content of this box
180 *
181 * @return string
182 */
183 public function get_content()
184 {
185 $content = $this->content;
186 $box = $this;
187
188 // replace boxzilla specific shortcodes
189 $close_link = "<a href=\"javascript:Boxzilla.dismiss({$this->ID});\">";
190
191 $replacements = [
192 '[boxzilla_close]' => $close_link, // accept underscore and dash here for consistency with other shortcode
193 '[boxzilla-close]' => $close_link,
194 '[/boxzilla_close]' => '</a>',
195 '[/boxzilla-close]' => '</a>',
196 ];
197
198 $content = str_replace(array_keys($replacements), array_values($replacements), $content);
199
200 /**
201 * Filters the HTML for the box content
202 *
203 * @param string $content
204 * @param Box $box
205 */
206 $content = apply_filters('boxzilla_box_content', $content, $box);
207 return $content;
208 }
209
210 /**
211 * Get options object for JS script.
212 *
213 * @return array
214 */
215 public function get_client_options()
216 {
217 $box = $this;
218
219 $trigger = false;
220 if ($box->options['trigger']) {
221 $trigger = [
222 'method' => $this->options['trigger'],
223 ];
224
225 if (isset($this->options[ 'trigger_' . $this->options['trigger'] ])) {
226 $trigger['value'] = $this->options[ 'trigger_' . $this->options['trigger'] ];
227 }
228 }
229
230 // build screenWidthCondition object (or null)
231 $screen_width_condition = null;
232 if ($box->options['screen_size_condition']['value'] > 0) {
233 $screen_width_condition = [
234 'condition' => $box->options['screen_size_condition']['condition'],
235 'value' => intval($box->options['screen_size_condition']['value']),
236 ];
237 }
238
239 $post = $this->post;
240 $client_options = [
241 'id' => $box->ID,
242 'icon' => $box->get_close_icon(),
243 'content' => '', // we grab this later from an HTML element
244 'css' => array_filter($box->options['css']),
245 'trigger' => $trigger,
246 'animation' => $box->options['animation'],
247 'cookie' => [
248 'triggered' => absint($box->options['cookie']['triggered']),
249 'dismissed' => absint($box->options['cookie']['dismissed']),
250 ],
251 'rehide' => (bool) $box->options['auto_hide'],
252 'position' => $box->options['css']['position'],
253 'screenWidthCondition' => $screen_width_condition,
254 'closable' => ! ! $box->options['closable'],
255 'post' => [
256 'id' => $post->ID,
257 'title' => $post->post_title,
258 'slug' => $post->post_name,
259 ],
260 ];
261
262 /**
263 * Filter the final options for the JS Boxzilla client.
264 *
265 * @param array $client_options
266 * @param Box $box
267 */
268 $client_options = apply_filters('boxzilla_box_client_options', $client_options, $box);
269
270 return $client_options;
271 }
272 }
273