PluginProbe
MaxButtons – Create buttons / 6.28
MaxButtons – Create buttons v6.28
6.23 6.24 6.25 6.26 6.26.1 6.27 6.28 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7.0 7.1 7.1.1 7.1.2 7.1.3 7.10 7.11 7.13 7.13.1 7.13.2 7.13.3 All 100 releases
maxbuttons / blocks / basic.php

basic.php in MaxButtons – Create buttons 6.28, at blocks/basic.php

526 lines 17.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace MaxButtons;
3 defined('ABSPATH') or die('No direct access permitted');
4
5 $blockClass["basic"] = "basicBlock";
6 $blockOrder[0][] = "basic";
7
8
9 class basicBlock extends maxBlock
10 {
11 protected $blockname = "basic";
12 protected $fields = array("name" => array("default" => ''),
13 "status" => array("default" => "publish"),
14 "description" => array("default" => ''),
15 "url" => array("default" => ''),
16 'link_title' => array('default' => ''),
17 // "text" => array("default" => ''),
18 "new_window" => array("default" => 0),
19 "nofollow" => array("default" => 0)
20 );
21 protected $protocols = array("http","https",'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'sms', 'callto', 'fax', 'xmpp', "javascript", 'file', 'ms-windows-store', 'steam', 'webcal'); // allowed url protocols for esc_url functions
22
23
24 function __construct()
25 {
26 parent::__construct();
27 $extra_protocols = get_option('maxbuttons_protocol');
28 $extra_protocols = array_map('trim', array_filter(explode(',', $extra_protocols)));
29
30 if (is_array($extra_protocols) && count($extra_protocols) > 0)
31 {
32 $this->protocols = array_merge($this->protocols, $extra_protocols);
33 }
34 }
35
36
37 public function parse_css($css, $mode = 'normal')
38 {
39 // emtpy string init is not like by PHP 7.1
40 if (! is_array($css))
41 $css = array();
42
43 $data = $this->data[$this->blockname];
44
45 $css["maxbutton"]["normal"]["position"] = "relative";
46 $css["maxbutton"]["normal"]["text-decoration"] = "none";
47 // $css["maxbutton"]["normal"]["white-space"] = "nowrap"; // hinders correct rendering of oneline-multilines
48 $css["maxbutton"]["normal"]["display"] = "inline-block";
49
50 /*if (isset($data["url"]) && $data["url"] == '') // don't show clickable anchor if there is no URL.
51 {
52 $css["maxbutton"]["normal"]["cursor"] = 'default';
53 // $css[":hover"]["cursor"] = 'default';
54 } */
55
56 return $css;
57
58 }
59
60 public function save_fields($data, $post)
61 {
62 // Possible solution:
63 // $post["url"] = isset($post["url"]) ? urldecode(urldecode($post["url"])) : '';
64
65 $description = false;
66
67 if (isset($post["description"]) && $post["description"] != '')
68 {
69 $description = str_replace("\n", '-nwline-', $post["description"]);
70 $description = sanitize_text_field($description);
71 $description = str_replace('-nwline-', "\n", $description);
72
73 }
74
75 $data = parent::save_fields($data, $post);
76
77 // bypass sanitize for description - causing the end of line-breaks
78 if ($description)
79 $data["basic"]["description"] = $description;
80
81 // bypassing sanitize text field - causes problems with URLs and spaces
82 $url = isset($post["url"]) ? trim($post["url"]) : '';
83
84 $parsed_url = parse_url($url);
85 $rawEncode = array("query","fragment");
86 foreach($rawEncode as $item)
87 {
88 if (isset($parsed_url[$item]))
89 {
90 $parsed_url[$item] = rawurlencode($parsed_url[$item]);
91 }
92 }
93
94 $url = $this->unParseURL($parsed_url);
95
96 $url = str_replace(" ", "%20", trim($url) );
97
98 if (! $this->checkRelative($parsed_url))
99 $url = esc_url_raw($url, $this->protocols); // str replace - known WP issue with spaces
100
101 $data[$this->blockname]["url"] = $url;
102
103 if (isset($post["name"]))
104 $data["name"] = sanitize_text_field($post["name"]);
105 if (isset($post["status"]))
106 $data["status"] = sanitize_text_field($post["status"]); // for conversion old - new.
107 return $data;
108 }
109
110 protected function unparseURL($parsed_url)
111 {
112 // Don't add // to these schemes
113 $noslash_schemes = array('javascript', 'mailto', 'tel', 'sms');
114 if (isset($parsed_url['scheme']) && in_array($parsed_url['scheme'], $noslash_schemes) )
115 $scheme = $parsed_url["scheme"] . ":";
116 else
117 $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
118
119
120 $host = isset($parsed_url['host']) ? $parsed_url['host'] : '';
121 $port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
122 $user = isset($parsed_url['user']) ? $parsed_url['user'] : '';
123 $pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : '';
124 $pass = ($user || $pass) ? "$pass@" : '';
125 $path = isset($parsed_url['path']) ? $parsed_url['path'] : '';
126 $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
127 $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
128 return "$scheme$user$pass$host$port$path$query$fragment";
129 }
130
131 /* Check for a relative URL that gets killed by esc_url ( if there is no / first ) */
132 protected function checkRelative($parsed_url)
133 {
134 if (! isset($parsed_url['host']) && ! isset($parsed_url['scheme']) )
135 {
136 if (isset($parsed_url['path']) && $parsed_url['path'] !== '' && substr($parsed_url['path'], 0,1) !== '/')
137 {
138 return true;
139 }
140 }
141 return false;
142 }
143
144 public function parse_button($domObj, $mode = 'normal')
145 {
146
147 $data = $this->data[$this->blockname];
148 $button_id = $this->data["id"];
149 $rels = array();
150
151 $anchor = $domObj->find("a",0);
152
153 if (isset($data["nofollow"]) && $data["nofollow"] == 1)
154 {
155 $rels[] = 'nofollow';
156 $rels[] = 'noopener';
157 }
158 // $anchor->rel = "nofollow";
159 // $buttonAttrs[] = "rel=nofollow";
160
161 if (isset($data["new_window"]) && $data["new_window"] == 1)
162 {
163 $anchor->target = "_blank";
164 if (! in_array('noopener', $rels))
165 $rels[] = 'noopener';
166 }
167 if (isset($data['link_title']) && strlen($data['link_title']) > 0)
168 $anchor->title = $data['link_title'];
169
170 $rels = apply_filters('mb/button/rel', $rels);
171
172 if (count($rels) > 0)
173 {
174 $anchor->rel = implode(' ', $rels);
175 }
176
177 if (isset($data["url"]) && $data["url"] != '')
178 {
179 $url = $data["url"];
180 $parsed_url = parse_url($url);
181
182 if (! $this->checkRelative($parsed_url))
183 $url = esc_url($url, $this->protocols);
184
185 $url = rawurldecode($url); // removes the + from a URL part.
186 $url = apply_filters('mb-url', $url, $data['url']); // passes processed url / raw url.
187 $url = apply_filters('mb-url-' . $button_id, $url, $data['url']);
188
189
190 $anchor->href = $url;
191 //do_shortcode( esc_url($url, $this->protocols) );
192
193 }
194 else // fixing an iOS problem which renders anchors without URL wrongly.
195 {
196 $anchor->href = 'javascript:void(0);';
197 }
198
199
200 return $domObj;
201
202 }
203
204 public function map_fields($map)
205 {
206
207 $map["url"]["attr"] = "href";
208 $map["link_title"]["attr"] = "title";
209
210 // $map["text"]["func"] = "updateAnchorText";
211
212 return $map;
213 }
214
215 public function admin_fields()
216 {
217
218 $icon_url = MB()->get_plugin_url() . 'images/icons/';
219 $admin = MB()->getClass('admin');
220 ?>
221
222 <div class="mb_tab option-container mb_tab">
223 <div class="title"><?php _e('Basics', 'maxbuttons') ?></div>
224 <div class="inside basic">
225 <?php
226 $color_copy_self = __("Replace color from other field", "maxbuttons");
227 $color_copy_move = __("Copy Color to other field", "maxbuttons");
228
229 // Name
230 $field_name = new maxField() ;
231 $field_name->label = __('Button Name', 'maxbuttons');
232 // $field_name->note = __('Something that you can quickly identify the button with.', 'maxbuttons');
233 $field_name->value = maxBlocks::getValue('name');
234 $field_name->id = 'name';
235 $field_name->name = $field_name->id;
236 $field_name->placeholder = __("Button Name","maxbuttons");
237 // $field_name->output('start','end');
238
239 $admin->addField($field_name, 'start', 'end');
240
241 // URL
242 $field_url = new maxField();
243 $field_url->label = __('URL', 'maxbuttons');
244 // $field_url->note = __('The link when the button is clicked.', 'maxbuttons');
245 $field_url->value = rawurldecode(maxBlocks::getValue('url') );
246 $field_url->id = 'url';
247 $field_url->placeholder = __("http://","maxbuttons");
248 $field_url->name = $field_url->id;
249
250 //$field_url->output('start','end');
251 $admin->addField($field_url,'start', 'end');
252
253 // Spacer
254 $fspacer = new maxField('spacer');
255 $fspacer->name = 'url_options';
256 $fspacer->label = '&nbsp;';
257 // $fspacer->output('start');
258
259 $admin->addField($fspacer, 'start');
260
261 // New Window
262 $fwindow = new maxField('checkbox');
263 $fwindow->label = __('Open in New Window', 'maxbuttons');
264 $fwindow->name = 'new_window';
265 $fwindow->id = $fwindow->name;
266 $fwindow->value = 1;
267 //$fwindow->inputclass = 'check_button';
268 $fwindow->checked = checked( maxBlocks::getValue('new_window'), 1, false);
269
270 //$fwindow->output('','');
271 $admin->addField($fwindow);
272
273 // NoRel
274 $ffollow = new maxField('checkbox');
275 $ffollow->label = __('Use rel="nofollow"', 'maxbuttons');
276 $ffollow->value = 1;
277 $ffollow->name = 'nofollow';
278 $ffollow->id = $ffollow->name;
279 $ffollow->checked = checked( maxBlocks::getValue('nofollow'), 1, false);
280
281 //$ffollow->output('','end');
282 $admin->addField($ffollow, '','end');
283 // TITLE
284
285 $field_title = new maxField();
286 $field_title->label = __('Button Tooltip', 'maxbuttons');
287 $field_title->name = 'link_title'; // title is too generic
288 $field_title->id = $field_title->name;
289 $field_title->value = maxBlocks::getValue('link_title');
290
291 //$field_title->output('start','end');
292 $admin->addField($field_title, 'start', 'end');
293
294 // TEXT
295 $field_text = new maxField();
296 $field_text->label = __('Text','maxbuttons');
297 $field_text->name = 'text';
298 $field_text->id = 'text';
299 $field_text->value = maxBlocks::getValue('text') ;
300
301 // $field_text->output('start','end');
302 $admin->addField($field_text, 'start', 'end');
303
304 // FONTS
305 $fonts = MB()->getClass('admin')->loadFonts();
306
307 $field_font = new maxField('generic');
308 $field_font->label = __('Font','maxbuttons');
309 $field_font->name = 'font';
310 $field_font->id = $field_font->name;
311 $field_font->value= maxBlocks::getValue('font');
312 $field_font->content = maxUtils::selectify($field_font->name, $fonts, $field_font->value);
313
314 //$field_font->output('start');
315 $admin->addField($field_font,'start');
316 ?>
317
318 <?php
319 // FONT SIZE
320 //global $maxbuttons_font_sizes;
321 $sizes = apply_filters('mb/editor/fontsizes', maxUtils::generate_font_sizes(10,50) );
322
323
324 $field_size = new maxField('number');
325 // $field_size->label = '';
326 $field_size->name = 'font_size';
327 $field_size->id= $field_size->name;
328 $field_size->inputclass = 'tiny';
329 $field_size->min = 8;
330 $field_size->value = maxUtils::strip_px(maxBlocks::getValue('font_size'));
331 //$field_size->content = maxUtils::selectify($field_size->name, $sizes, $field_size->value, '', 'small');
332
333 //$field_size->output();
334 $admin->addField($field_size);
335
336 // Font style checkboxes
337 $fweight = new maxField('checkbox');
338 $fweight->icon = 'dashicons-editor-bold';
339 $fweight->title = __("Bold",'maxbuttons');
340 $fweight->id = 'check_fweight';
341 $fweight->name = 'font_weight';
342 $fweight->value = 'bold';
343 $fweight->inputclass = 'check_button icon';
344 $fweight->checked = checked( maxBlocks::getValue('font_weight'), 'bold', false);
345
346 // $fweight->output('group_start');
347 $admin->addField($fweight, 'group_start');
348
349 $fstyle = new maxField('checkbox');
350 $fstyle->icon = 'dashicons-editor-italic';
351 $fstyle->title = __("Italic",'maxbuttons');
352 $fstyle->id = 'check_fstyle';
353 $fstyle->name = 'font_style';
354 $fstyle->value = 'italic';
355 $fstyle->inputclass = 'check_button icon';
356 $fstyle->checked = checked( maxBlocks::getValue('font_style'), 'italic', false);
357
358 //$fstyle->output('','group_end');
359 $admin->addField($fstyle, '', 'group_end');
360
361 $falign_left = new maxField('radio');
362 $falign_left->icon = 'dashicons-editor-alignleft';
363 $falign_left->title = __('Align left','maxbuttons');
364 $falign_left->id = 'radio_talign_left';
365 $falign_left->name = 'text_align';
366 $falign_left->value = 'left';
367 $falign_left->inputclass = 'check_button icon';
368 $falign_left->checked = checked ( maxblocks::getValue('text_align'), 'left', false);
369
370 //$falign_left->output('group_start');
371 $admin->addField($falign_left, 'group_start');
372
373 $falign_center = new maxField('radio');
374 $falign_center->icon = 'dashicons-editor-aligncenter';
375 $falign_center->title = __('Align center','maxbuttons');
376 $falign_center->id = 'radio_talign_center';
377 $falign_center->name = 'text_align';
378 $falign_center->value = 'center';
379 $falign_center->inputclass = 'check_button icon';
380 $falign_center->checked = checked( maxblocks::getValue('text_align'), 'center', false);
381
382 //$falign_center->output();
383 $admin->addField($falign_center);
384
385 $falign_right = new maxField('radio');
386 $falign_right->icon = 'dashicons-editor-alignright';
387 $falign_right->title = __('Align right','maxbuttons');
388 $falign_right->id = 'radio_talign_right';
389 $falign_right->name = 'text_align';
390 $falign_right->value = 'right';
391 $falign_right->inputclass = 'check_button icon';
392 $falign_right->checked = checked( maxblocks::getValue('text_align'), 'right', false);
393
394 //$falign_right->output('', array('group_end','end') );
395 $admin->addField($falign_right, '', array('group_end','end') );
396
397 // Padding - trouble
398 $ptop = new maxField('number');
399 $ptop->label = __('Padding', 'maxbuttons');
400 $ptop->id = 'padding_top';
401 $ptop->name = $ptop->id;
402 $ptop->min = 0;
403 $ptop->inputclass = 'tiny';
404 $ptop->before_input = '<img src="' . $icon_url . 'p_top.png" title="' . __("Padding Top","maxbuttons") . '" >';
405 $ptop->value = maxUtils::strip_px(maxBlocks::getValue('padding_top'));
406
407 //$ptop->output('start');
408 $admin->addField($ptop,'start');
409
410 $pright = new maxField('number');
411 $pright->id = 'padding_right';
412 $pright->name = $pright->id;
413 $pright->min = 0;
414 $pright->inputclass = 'tiny';
415 $pright->before_input = '<img src="' . $icon_url . 'p_right.png" class="icon padding" title="' . __("Padding Right","maxbuttons") . '" >';
416 $pright->value = maxUtils::strip_px(maxBlocks::getValue('padding_right'));
417
418 //$pright->output();
419 $admin->addField($pright);
420
421 $pbottom = new maxField('number');
422 $pbottom->id = 'padding_bottom';
423 $pbottom->name = $pbottom->id;
424 $pbottom->min = 0;
425 $pbottom->inputclass = 'tiny';
426 $pbottom->before_input = '<img src="' . $icon_url . 'p_bottom.png" class="icon padding" title="' . __("Padding Bottom","maxbuttons") . '" >';
427 $pbottom->value = maxUtils::strip_px(maxBlocks::getValue('padding_bottom'));
428
429 //$pbottom->output();
430 $admin->addField($pbottom);
431
432 $pleft = new maxField('number');
433 $pleft->id = 'padding_left';
434 $pleft->name = $pleft->id;
435 $pleft->min = 0;
436 $pleft->inputclass = 'tiny';
437 $pleft->before_input = '<img src="' . $icon_url . 'p_left.png" class="icon padding" title="' . __("Padding Left","maxbuttons") . '" >';
438 $pleft->value = maxUtils::strip_px(maxBlocks::getValue('padding_left'));
439
440 //$pleft->output('','end');
441 $admin->addField($pleft,'', 'end');
442
443
444 // Text Color
445 $fcolor = new maxField('color');
446 $fcolor->id = 'text_color';
447 $fcolor->name = $fcolor->id;
448 $fcolor->value = maxBlocks::getColorValue('text_color');
449 $fcolor->label = __('Text Color','maxbuttons');
450 $fcolor->copycolor = true;
451 $fcolor->bindto = 'text_color_hover';
452 $fcolor->copypos = 'right';
453 $fcolor->right_title = $color_copy_move;
454 $fcolor->left_title = $color_copy_self;
455
456 // $fcolor->output('start');
457 $admin->addField($fcolor, 'start');
458
459 // Text Color Hover
460 $fcolor_hover = new maxField('color');
461 $fcolor_hover->id = 'text_color_hover';
462 $fcolor_hover->name = $fcolor_hover->id;
463 $fcolor_hover->value = maxBlocks::getColorValue('text_color_hover');
464 $fcolor_hover->label = __('Text Color Hover','maxbuttons');
465 $fcolor_hover->copycolor = true;
466 $fcolor_hover->bindto = $fcolor->id;
467 $fcolor_hover->copypos = 'left';
468 $fcolor_hover->right_title = $color_copy_self;
469 $fcolor_hover->left_title = $color_copy_move;
470 //$fcolor_hover->output('','end');
471
472 $admin->addField($fcolor_hover, '','end');
473
474 // Dimension : width
475 $field_width = new maxField('number');
476 $field_width->label = __('Button Width','maxbuttons');
477 $field_width->name = 'button_width';
478 $field_width->id = $field_width->name;
479 $field_width->inputclass = 'small';
480 $field_width->min = 0;
481 $field_width->value= maxUtils::strip_px(maxBlocks::getValue('button_width')); // strippx?
482 //$field_width->output('start');
483
484 $admin->addField($field_width, 'start');
485
486 // Dimension : height
487 $field_height = new maxField('number');
488 $field_height->label = __('Button Height','maxbuttons');
489 $field_height->name = 'button_height';
490 $field_height->id = $field_height->name;
491 $field_height->inputclass = 'small';
492 $field_height->min = 0;
493 $field_height->value= maxUtils::strip_px(maxBlocks::getValue('button_height')); // strippx?
494 //$field_height->output('','end');
495
496 $admin->addField($field_height, '', 'end');
497
498 // Description
499 $description_hide = get_option('maxbuttons_hidedescription');
500 if ($description_hide == 1)
501 $field_desc = new maxField('hidden');
502 else
503 $field_desc = new maxField('textarea');
504
505 $field_desc->label = __('Description', 'maxbuttons');
506 $field_desc->name = 'description';
507 $field_desc->id = $field_desc->name;
508 $field_desc->esc_function = 'esc_textarea';
509 $field_desc->value = maxBlocks::getValue('description') ;
510 $field_desc->placeholder = __('Brief explanation about how and where the button is used.','maxbuttons');
511 //$field_desc->output('start','end');
512
513 $admin->addField($field_desc, 'start', 'end');
514
515 $admin->display_fields();
516 ?>
517
518
519 </div>
520 </div>
521 <?php } // admin_display
522
523 } // class
524
525 ?>
526