-
Notifications
You must be signed in to change notification settings - Fork 96
/
MemberImportForm.php
151 lines (131 loc) · 4.99 KB
/
MemberImportForm.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
namespace SilverStripe\Admin;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Security\Group;
use SilverStripe\Security\MemberCsvBulkLoader;
use SilverStripe\Forms\LiteralField;
use SilverStripe\Forms\FileField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Form;
use SilverStripe\View\Requirements;
use SilverStripe\Dev\Deprecation;
/**
* Imports {@link Member} records by CSV upload, as defined in
* {@link MemberCsvBulkLoader}.
* @deprecated 1.13.0 Will be removed without equivalent functionality to replace it
*/
class MemberImportForm extends Form
{
/**
* @var Group Optional group relation
*/
protected $group;
public function __construct($controller, $name, $fields = null, $actions = null, $validator = null)
{
Deprecation::withNoReplacement(function () {
Deprecation::notice('1.13.0', 'Will be removed without equivalent functionality to replace it', Deprecation::SCOPE_CLASS);
});
if (!$fields) {
$helpHtml = _t(
__CLASS__ . '.Help1',
'<p>Import users in <em>CSV format</em> (comma-separated values).'
. ' <small><a href="#" class="toggle-advanced">Show advanced usage</a></small></p>'
);
$importer = new MemberCsvBulkLoader();
$importSpec = $importer->getImportSpec();
$columns = implode(', ', array_keys($importSpec['fields'] ?? []));
$helpHtml .= _t(
__CLASS__ . '.Help2',
'<div class="advanced">'
. '<h4>Advanced usage</h4>'
. '<ul>'
. '<li>Allowed columns: <em>{columns}</em></li>'
. '<li>Existing users are matched by their unique <em>Code</em> property, and updated with any new values from '
. 'the imported file.</li>'
. '<li>Groups can be assigned by the <em>Groups</em> column. Groups are identified by their <em>Code</em> property, '
. 'multiple groups can be separated by comma. Existing group memberships are not cleared.</li>'
. '</ul>'
. '</div>',
['columns' => $columns]
);
$fields = new FieldList(
new LiteralField('Help', $helpHtml),
$fileField = new FileField(
'CsvFile',
DBField::create_field('HTMLFragment', _t(
__CLASS__ . '.FileFieldLabel',
'CSV File <small>(Allowed extensions: *.csv)</small>'
))
)
);
$fileField->getValidator()->setAllowedExtensions(['csv']);
}
if (!$actions) {
$action = new FormAction('doImport', _t(__CLASS__ . '.BtnImport', 'Import from CSV'));
$action->addExtraClass('btn btn-outline-secondary font-icon-upload');
$actions = new FieldList($action);
}
if (!$validator) {
$validator = new RequiredFields('CsvFile');
}
parent::__construct($controller, $name, $fields, $actions, $validator);
Requirements::javascript('silverstripe/admin:client/dist/js/vendor.js');
Requirements::javascript('silverstripe/admin:client/dist/js/MemberImportForm.js');
Requirements::css('silverstripe/admin:client/dist/styles/bundle.css');
$this->addExtraClass('cms');
$this->addExtraClass('import-form');
}
public function doImport($data, $form)
{
$loader = new MemberCsvBulkLoader();
$loader->setCheckPermissions(true);
// optionally set group relation
if ($this->group) {
$loader->setGroups([$this->group]);
}
// load file
$result = $loader->load($data['CsvFile']['tmp_name']);
// result message
$msgArr = [];
if ($result->CreatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultCreated',
'Created {count} members',
['count' => $result->CreatedCount()]
);
}
if ($result->UpdatedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultUpdated',
'Updated {count} members',
['count' => $result->UpdatedCount()]
);
}
if ($result->DeletedCount()) {
$msgArr[] = _t(
__CLASS__ . '.ResultDeleted',
'Deleted {count} members',
['count' => $result->DeletedCount()]
);
}
$msg = ($msgArr) ? implode(',', $msgArr) : _t(__CLASS__ . '.ResultNone', 'No changes');
$this->sessionMessage($msg, 'good');
$this->controller->redirectBack();
}
/**
* @param $group Group
*/
public function setGroup($group)
{
$this->group = $group;
}
/**
* @return Group
*/
public function getGroup($group)
{
return $this->group;
}
}