-
Notifications
You must be signed in to change notification settings - Fork 0
/
block_unpublish.module
247 lines (225 loc) · 9.4 KB
/
block_unpublish.module
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
<?php
/*
* Implements hook_menu().
*/
function block_unpublish_menu() {
$items['block_unpublish/process/%user'] = array(
'title' => 'Block and unpublish',
'page callback' => 'drupal_get_form',
'page arguments' => array('block_unpublish_process_batch', 2),
'access callback' => 'block_unpublish_access',
'access arguments' => array('process', 2),
);
$items['admin/config/content/block_unpublish'] = array(
'title' => 'Block and Unpublish',
'description' => 'Configure Block and Unpublish settings',
'page callback' => 'drupal_get_form',
'page arguments' => array('block_unpublish_admin_settings'),
'access arguments' => array('administer block unpublish'),
);
return $items;
}
/*
* Implements hook_permission().
*/
function block_unpublish_permission() {
$perms = array(
'block unpublish' => array(
'title' => t('Block and unpublish'),
'description' => t('Block user and unpublish its content'),
),
'administer block unpublish' => array(
'title' => t('Administer block and unpublish'),
'description' => t('Perform administration tasks and configure the block unpublish module'),
),
);
return $perms;
}
/*
* Implements access callback from use in hook_menu and hook_user_view.
*/
function block_unpublish_access($type, $account) {
switch ($type) {
case 'process':
$exclude_roles = variable_get('block_unpublish_exclude_roles', array());
//check if the selected user belongs to a protected role.
$roles_match = array_intersect($exclude_roles, array_flip($account->roles));
return (empty($roles_match)) ? user_access('block unpublish') : FALSE;
break;
default:
return FALSE;
}
}
/*
* Implements hook_user_view().
*/
function block_unpublish_user_view($account, $view_mode, $langcode) {
if (block_unpublish_access('process', $account)) {
$account->content['block_unpublish'] = array(
'#markup' => l(t('Block user and Unpublish content'), 'block_unpublish/process/' . $account->uid, array('attributes' => array('class' => 'block_unpublish'))),
'#weight' => 10,
'#type' => 'user_profile_item',
'#title' => t('User moderation'),
);
}
}
/*
* get entity id's by uid property
* return empty array when no results are found
*/
function block_unpublish_get_entity_by_uid($entity_type, $uid) {
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', $entity_type)
->propertyCondition('uid', $uid);
$result = $query->execute();
return (empty($result)) ? array() : array_keys($result[$entity_type]);
}
/*
* Implement confirm form to protect accidental batch processing
*/
function block_unpublish_process_batch($form, $form_state, $account) {
$question = t('Are you sure you want to block %user and unpublish its content?', array('%user' => $account->name));
$path = 'user/' . $account->uid;
$form = array(
'account' => array(
'#type' => 'value',
'#value' => $account,
)
);
return confirm_form($form, $question, $path);
}
/*
* Implmenent form submit to process batch
*/
function block_unpublish_process_batch_submit($form, &$form_state) {
$account = $form_state['values']['account'];
//add the user entity to batch operations
if (variable_get('block_unpublish_process_user', TRUE)) {
$operations[] = array('block_unpublish_batch_set_status', array('user', array($account->uid)));
}
//add entities selected in settings form to batch operations
$entities = variable_get('block_unpublish_process_entities', array());
foreach ($entities as $entity) {
$ids = block_unpublish_get_entity_by_uid($entity, $account->uid);
$operations[] = array('block_unpublish_batch_set_status', array($entity, $ids));
}
$batch = array(
'operations' => $operations,
'finished' => 'block_unpublish_batch_finished',
'title' => t('Block user and unpublish content'),
'progress_message' => t('Processed @current out of @total.'),
'error_message' => t('Batch has encountered an error.'),
);
batch_set($batch);
$form_state['redirect'] = 'user/' . $account->uid;
}
/*
* Implement batch callback
*/
function block_unpublish_batch_set_status($entity_type, $ids, &$context) {
if (!isset($context['sandbox']['progress'])) {
$context['sandbox']['progress'] = 0;
$context['sandbox']['max'] = count($ids);
}
// the amount of entities to set status in a single batch
$limit = variable_get('block_unpublish_process_limit', 5);
//take part of the ids array defined by limit and process these ids
$limit_ids = array_slice($ids, $context['sandbox']['progress'], $limit, TRUE);
foreach ($limit_ids as $key => $id) {
$wrapper = entity_metadata_wrapper($entity_type, $id);
$context['message'] = t('Now processing %entity_type: %label', array('%entity_type' => $entity_type, '%label' => $wrapper->label()));
$context['results'][$entity_type][] = $wrapper->label();
$wrapper->status->set(0);
$wrapper->save();
}
//set progress to the last key to use in next iteration
if (isset($key)) {
$context['sandbox']['progress'] = $key;
}
if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
$context['finished'] = ($context['sandbox']['progress'] + 1) / $context['sandbox']['max'];
}
}
/*
* Implement batch callback when finished
*/
function block_unpublish_batch_finished($success, $results, $operations) {
if ($success) {
foreach ($results as $entity_type => $ids) {
$entity_name = (count($ids) > 1) ? $entity_type . 's' : $entity_type;
drupal_set_message(t('@num %entity_name blocked or unpublished', array('@num' => count($ids), '%entity_name' => $entity_name)));
}
} else {
$error_operation = reset($operations);
$message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
drupal_set_message($message, 'error');
}
}
/*
* Implement system settigns form
*/
function block_unpublish_admin_settings($form, &$form_values) {
//load all entities and select only only entities which
//have both status and author property
$entities = entity_get_info();
foreach (array_keys($entities) as $entity) {
$properties = entity_get_all_property_info($entity);
if (isset($properties['status']) && isset($properties['author'])) {
$options[$entity] = $entity;
}
}
$form['block_unpublish_process_user'] = array(
'#type' => 'checkbox',
'#title' => 'Block user',
'#description' => 'Check to block the user when processing the request',
'#default_value' => variable_get('block_unpublish_process_user', TRUE),
);
$form['block_unpublish_process_entities'] = array(
'#type' => 'select',
'#title' => 'Select entities to process',
'#options' => $options,
'#default_value' => variable_get('block_unpublish_process_entities', array()),
'#multiple' => TRUE,
'#description' => 'You can select multiple entities by holding down ctrl key'
);
$form['block_unpublish_process_limit'] = array(
'#type' => 'select',
'#title' => 'Batch limit',
'#options' => drupal_map_assoc(range(1, 99)),
'#default_value' => variable_get('block_unpublish_process_limit', '5'),
'#description' => 'When the status of a large amount of data/entities needs to be changed, this can be tweaked.'
);
//drupal has support for a default admin role. we should probably set that as default for roles exclusion.
$form['block_unpublish_exclude_roles'] = array(
'#type' => 'select',
'#title' => 'Select roles',
'#options' => user_roles(TRUE),
'#default_value' => variable_get('block_unpublish_exclude_roles', array()),
'#multiple' => TRUE,
'#description' => 'Select the roles which should be excluded from beeing processed'
);
return system_settings_form($form);
}
/*
* Implement hook_entity_view
* Add block and unpublish link to entities which are selected in module
* configuration page.
*/
function block_unpublish_entity_view($entity, $type, $view_mode, $langcode) {
$account = user_load($entity->uid);
if (block_unpublish_access('process', $account) && ($entity->status)) {
$entities = variable_get('block_unpublish_process_entities', array());
foreach ($entities as $entity_type) {
if ($type == $entity_type) {
$entity->content['links'][$type]['#links']['comment-block-unpublish'] = array(
'title' => t('ban'),
'href' => 'block_unpublish/process/' . $account->uid,
'html' => TRUE,
'attributes' => array(
'title' => 'Block and Unpublish',
),
);
}
}
}
}