/
AssignUsersToWorkflowAction.php
95 lines (80 loc) · 2.91 KB
/
AssignUsersToWorkflowAction.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
<?php
/**
* A workflow action that allows additional users or groups to be assigned to
* the workflow part-way through the workflow path.
*
* @license BSD License (http://silverstripe.org/bsd-license/)
* @package advancedworkflow
* @subpackage actions
*/
class AssignUsersToWorkflowAction extends WorkflowAction {
private static $db = array(
'AssignInitiator' => 'Boolean',
);
private static $many_many = array(
'Users' => 'Member',
'Groups' => 'Group'
);
public static $icon = 'advancedworkflow/images/assign.png';
public function execute(WorkflowInstance $workflow) {
$workflow->Users()->removeAll();
//Due to http://open.silverstripe.org/ticket/8258, there are errors occuring if Group has been extended
//We use a direct delete query here before ticket 8258 fixed
//$workflow->Groups()->removeAll();
$workflowID = $workflow->ID;
$query = <<<SQL
DELETE FROM "WorkflowInstance_Groups" WHERE ("WorkflowInstance_Groups"."WorkflowInstanceID" = '$workflowID');
SQL;
DB::query($query);
$workflow->Users()->addMany($this->Users());
$workflow->Groups()->addMany($this->Groups());
if ($this->AssignInitiator) {
$workflow->Users()->add($workflow->Initiator());
}
return true;
}
public function getCMSFields() {
$fields = parent::getCMSFields();
$cmsUsers = Member::mapInCMSGroups();
$fields->addFieldsToTab('Root.Main', array(
new HeaderField('AssignUsers', $this->fieldLabel('AssignUsers')),
new CheckboxField('AssignInitiator', $this->fieldLabel('AssignInitiator')),
$users = CheckboxSetField::create('Users', $this->fieldLabel('Users'), $cmsUsers),
new TreeMultiselectField('Groups', $this->fieldLabel('Groups'), 'Group')
));
// limit to the users which actually can access the CMS
$users->setSource(Member::mapInCMSGroups());
return $fields;
}
public function fieldLabels($relations = true) {
return array_merge(parent::fieldLabels($relations), array(
'AssignUsers' => _t('AssignUsersToWorkflowAction.ASSIGNUSERS', 'Assign Users'),
'Users' => _t('AssignUsersToWorkflowAction.USERS', 'Users'),
'Groups' => _t('AssignUsersToWorkflowAction.GROUPS', 'Groups'),
'AssignInitiator' => _t('AssignUsersToWorkflowAction.INITIATOR', 'Assign Initiator'),
));
}
/**
* Returns a set of all Members that are assigned to this WorkflowAction subclass, either directly or via a group.
*
* @return ArrayList
*/
public function getAssignedMembers() {
$members = $this->Users();
$groups = $this->Groups();
// Can't merge instances of DataList so convert to something where we can
$_members = ArrayList::create();
$members->each(function($item) use(&$_members) {
$_members->push($item);
});
$_groups = ArrayList::create();
$groups->each(function($item) use(&$_groups) {
$_groups->push($item);
});
foreach($_groups as $group) {
$_members->merge($group->Members());
}
$_members->removeDuplicates();
return $_members;
}
}