commiting uncommited changes on live site
[weblabels.fsf.org.git] / crm.fsf.org / 20131203 / files / sites / all / modules-old / views_bulk_operations / plugins / operation_types / action.class.php
1 <?php
2
3 /**
4 * @file
5 * Defines the class for core actions.
6 * Belongs to the "action" operation type plugin.
7 */
8
9 class ViewsBulkOperationsAction extends ViewsBulkOperationsBaseOperation {
10
11 /**
12 * Contains the options provided by the user in the configuration form.
13 *
14 * @var array
15 */
16 public $formOptions = array();
17
18 /**
19 * Returns the access bitmask for the operation, used for entity access checks.
20 */
21 public function getAccessMask() {
22 // Assume edit by default.
23 if (empty($this->operationInfo['behavior'])) {
24 $this->operationInfo['behavior'] = array('changes_property');
25 }
26
27 $mask = 0;
28 if (in_array('views_property', $this->operationInfo['behavior'])) {
29 $mask |= VBO_ACCESS_OP_VIEW;
30 }
31 if (in_array('changes_property', $this->operationInfo['behavior'])) {
32 $mask |= VBO_ACCESS_OP_UPDATE;
33 }
34 if (in_array('creates_property', $this->operationInfo['behavior'])) {
35 $mask |= VBO_ACCESS_OP_CREATE;
36 }
37 if (in_array('deletes_property', $this->operationInfo['behavior'])) {
38 $mask |= VBO_ACCESS_OP_DELETE;
39 }
40 return $mask;
41 }
42
43 /**
44 * Returns whether the provided account has access to execute the operation.
45 *
46 * @param $account
47 */
48 public function access($account) {
49 // Use actions_permissions if enabled.
50 if (module_exists('actions_permissions')) {
51 $perm = actions_permissions_get_perm($this->operationInfo['label'], $this->operationInfo['key']);
52 if (!user_access($perm, $account)) {
53 return FALSE;
54 }
55 }
56 // Check against additional permissions.
57 if (!empty($this->operationInfo['permissions'])) {
58 foreach ($this->operationInfo['permissions'] as $perm) {
59 if (!user_access($perm, $account)) {
60 return FALSE;
61 }
62 }
63 }
64 // Access granted.
65 return TRUE;
66 }
67
68 /**
69 * Returns the configuration form for the operation.
70 * Only called if the operation is declared as configurable.
71 *
72 * @param $form
73 * The views form.
74 * @param $form_state
75 * An array containing the current state of the form.
76 * @param $context
77 * An array of related data provided by the caller.
78 */
79 public function form($form, &$form_state, array $context) {
80 // Some modules (including this one) place their action callbacks
81 // into separate files. At this point those files might no longer be
82 // included due to an #ajax rebuild, so we call actions_list() to trigger
83 // inclusion. The same thing is done by actions_do() on execute.
84 actions_list();
85
86 $context['settings'] = $this->getAdminOption('settings', array());
87 $form_callback = $this->operationInfo['callback'] . '_form';
88 return $form_callback($context, $form_state);
89 }
90
91 /**
92 * Validates the configuration form.
93 * Only called if the operation is declared as configurable.
94 *
95 * @param $form
96 * The views form.
97 * @param $form_state
98 * An array containing the current state of the form.
99 */
100 public function formValidate($form, &$form_state) {
101 // Some modules (including this one) place their action callbacks
102 // into separate files. At this point those files might no longer be
103 // included due to a page reload, so we call actions_list() to trigger
104 // inclusion. The same thing is done by actions_do() on execute.
105 actions_list();
106
107 $validation_callback = $this->operationInfo['callback'] . '_validate';
108 if (function_exists($validation_callback)) {
109 $validation_callback($form, $form_state);
110 }
111 }
112
113 /**
114 * Handles the submitted configuration form.
115 * This is where the operation can transform and store the submitted data.
116 * Only called if the operation is declared as configurable.
117 *
118 * @param $form
119 * The views form.
120 * @param $form_state
121 * An array containing the current state of the form.
122 */
123 public function formSubmit($form, &$form_state) {
124 // Some modules (including this one) place their action callbacks
125 // into separate files. At this point those files might no longer be
126 // included due to a page reload, so we call actions_list() to trigger
127 // inclusion. The same thing is done by actions_do() on execute.
128 actions_list();
129
130 $submit_callback = $this->operationInfo['callback'] . '_submit';
131 $this->formOptions = $submit_callback($form, $form_state);
132 }
133
134 /**
135 * Returns the admin options form for the operation.
136 *
137 * The admin options form is embedded into the VBO field settings and used
138 * to configure operation behavior. The options can later be fetched
139 * through the getAdminOption() method.
140 *
141 * @param $dom_id
142 * The dom path to the level where the admin options form is embedded.
143 * Needed for #dependency.
144 * @param $field_handler
145 * The Views field handler object for the VBO field.
146 */
147 public function adminOptionsForm($dom_id, $field_handler) {
148 $form = parent::adminOptionsForm($dom_id, $field_handler);
149
150 $settings_form_callback = $this->operationInfo['callback'] . '_views_bulk_operations_form';
151 if (function_exists($settings_form_callback)) {
152 $settings = $this->getAdminOption('settings', array());
153
154 $form['settings'] = array(
155 '#type' => 'fieldset',
156 '#title' => t('Operation settings'),
157 '#collapsible' => TRUE,
158 '#dependency' => array(
159 $dom_id . '-selected' => array(1),
160 ),
161 );
162 $settings_dom_id = $dom_id . '-settings';
163 $form['settings'] += $settings_form_callback($settings, $this->entityType, $settings_dom_id);
164 }
165
166 return $form;
167 }
168
169 /**
170 * Validates the admin options form.
171 *
172 * @param $form
173 * The admin options form.
174 * @param $form_state
175 * An array containing the current state of the form. Note that this array
176 * is constructed by the VBO views field handler, so it's not a real form
177 * state, it contains only the 'values' key.
178 * @param $error_element_base
179 * The base to prepend to field names when using form_set_error().
180 * Needed because the admin settings form is embedded into a bigger form.
181 */
182 public function adminOptionsFormValidate($form, &$form_state, $error_element_base) {
183 parent::adminOptionsFormValidate($form, $form_state, $error_element_base);
184
185 if (!empty($form['settings'])) {
186 $settings_validation_callback = $this->operationInfo['callback'] . '_views_bulk_operations_form_validate';
187 if (function_exists($settings_validation_callback)) {
188 $fake_form = $form['settings'];
189 $fake_form_state = array('values' => &$form_state['values']['settings']);
190 $error_element_base .= 'settings][';
191
192 $settings_validation_callback($fake_form, $fake_form_state, $error_element_base);
193 }
194 }
195 }
196
197 /**
198 * Handles the submitted admin options form.
199 * Note that there is no need to handle saving the options, that is done
200 * by the VBO views field handler, which also injects the options into the
201 * operation object upon instantiation.
202 *
203 * @param $form
204 * The admin options form.
205 * @param $form_state
206 * An array containing the current state of the form. Note that this array
207 * is constructed by the VBO views field handler, so it's not a real form
208 * state, it contains only the 'values' key.
209 */
210 public function adminOptionsFormSubmit($form, &$form_state) {
211 parent::adminOptionsFormSubmit($form, $form_state);
212
213 if (!empty($form['settings'])) {
214 $settings_submit_callback = $this->operationInfo['callback'] . '_views_bulk_operations_form_submit';
215 if (function_exists($settings_submit_callback)) {
216 $fake_form = $form['settings'];
217 $fake_form_state = array('values' => &$form_state['values']['settings']);
218
219 $settings_submit_callback($form, $form_state);
220 }
221 }
222 }
223
224 /**
225 * Returns whether the operation needs the full selected views rows to be
226 * passed to execute() as a part of $context.
227 */
228 public function needsRows() {
229 return !empty($this->operationInfo['pass rows']);
230 }
231
232 /**
233 * Executes the selected operation on the provided data.
234 *
235 * @param $data
236 * The data to to operate on. An entity or an array of entities.
237 * @param $context
238 * An array of related data (selected views rows, etc).
239 */
240 public function execute($data, array $context) {
241 $context['entity_type'] = $this->entityType;
242 $context['settings'] = $this->getAdminOption('settings', array());
243 $context += $this->formOptions;
244 $context += $this->operationInfo['parameters'];
245 // Actions provided by the Drupal system module require the entity to be
246 // present in $context, keyed by entity type.
247 if (is_object($data)) {
248 $context[$this->entityType] = $data;
249 }
250
251 actions_do($this->operationInfo['callback'], $data, $context);
252
253 // The action might need to have its entities saved after execution.
254 if (in_array('changes_property', $this->operationInfo['behavior'])) {
255 $data = is_array($data) ? $data : array($data);
256 foreach ($data as $entity) {
257 entity_save($this->entityType, $entity);
258 }
259 }
260 }
261 }