-
Notifications
You must be signed in to change notification settings - Fork 1
/
AbstractWidget.php
135 lines (119 loc) · 3.55 KB
/
AbstractWidget.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
namespace Amarkal\Widget;
abstract class AbstractWidget extends \WP_Widget
{
/**
* @var array The configuration array
*/
private $config;
/**
* @var \Amarkal\UI\Form Amarkal UI for data processing
*/
private $form;
/**
* Get the user config and call the parent constructor
*/
public function __construct()
{
$config = $this->get_config();
parent::__construct(
$config['id'],
$config['name'],
$config['widget_options'],
$config['control_options']
);
}
/**
* Generates the administration form for the widget
*
* @param array $instance The array of keys and values for the widget
*/
public function form( $instance )
{
$form = $this->get_form();
$cl = $form->get_component_list();
$form->update($instance);
// Set the widget-specific names and ids
foreach( $cl->get_value_components() as $component )
{
$component->original_name = $component->name;
$component->id = $this->get_field_id($component->name);
$component->name = $this->get_field_name($component->name);
}
include __DIR__.'/Form.phtml';
// Use the original names again (for when the components update)
foreach( $cl->get_value_components() as $component )
{
$component->id = $component->original_name;
$component->name = $component->original_name;
}
}
/**
* Process the widget's options before they are saved into the db
*
* @param array $new_instance The previous instance of values before the update.
* @param array $old_instance The new instance of values to be generated via the update.
*/
public function update( $new_instance, $old_instance )
{
$form = $this->get_form();
return $form->update($new_instance, $old_instance);
}
/**
* Get the Amarkal UI form.
*
* @return \Amarkal\UI\Form
*/
private function get_form()
{
if( !isset($this->form) )
{
$config = $this->get_config();
$this->form = new \Amarkal\UI\Form(
new \Amarkal\UI\ComponentList($config['fields'])
);
}
return $this->form;
}
/**
* Get the default widget configuration.
*
* @return array
*/
private function default_config()
{
return array(
'id' => null,
'name' => null,
'widget_options' => array(),
'control_options' => array(),
'fields' => array()
);
}
/**
* Get the configuraiton array, merging between the user and the default
* configuration values.
*
* @return array
* @throws \RuntimeException if the configuration is missing the ID argument
*/
private function get_config()
{
if( !isset($this->config) )
{
$this->config = array_merge(
$this->default_config(),
$this->config()
);
if( null === $this->config['id'] )
{
throw new \RuntimeException('No \'id\' was sepcified in the widget configuration');
}
}
return $this->config;
}
/**
* The user configuration array. Must be implemented in the child class.
*/
abstract public function config();
}