Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

FEATURE Import members and their group assignments from CSV in admin/…

…security through the new MemberImportForm class

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/trunk@98708 467b73ca-7a2a-4603-9d3b-597d59a354a9
  • Loading branch information...
commit 89c926221f34db78baada582cae649ba5980d968 1 parent 5cd476c
@chillu chillu authored
View
84 code/MemberImportForm.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Imports {@link Member} records by CSV upload, as defined in
+ * {@link MemberCsvBulkLoader}.
+ *
+ * @package cms
+ * @subpackage batchactions
+ */
+class MemberImportForm extends Form {
+
+ /**
+ * @var Group Optional group relation
+ */
+ protected $group;
+
+ function __construct($controller, $name, $fields = null, $actions = null, $validator = null) {
+ if(!$fields) {
+ $fields = new FieldSet(
+ $fileField = new FileField(
+ 'CsvFile',
+ _t(
+ 'SecurityAdmin_MemberImportForm.FileFieldLabel',
+ 'CSV File <small>(Allowed extensions: *.csv)</small>'
+ )
+ )
+ );
+ $fileField->setAllowedExtensions(array('csv'));
+ }
+
+ if(!$actions) $actions = new FieldSet(
+ new FormAction('doImport', _t('SecurityAdmin_MemberImportForm.BtnImport', 'Import'))
+ );
+
+ if(!$validator) $validator = new RequiredFields('CsvFile');
+
+
+ parent::__construct($controller, $name, $fields, $actions, $validator);
+ }
+
+ function doImport($data, $form) {
+ $loader = new MemberCsvBulkLoader();
+
+ // optionally set group relation
+ if($this->group) $loader->setGroups(array($this->group));
+
+ // load file
+ $result = $loader->load($data['CsvFile']['tmp_name']);
+
+ // result message
+ $msgArr = array();
+ if($result->CreatedCount()) $msgArr[] = sprintf(
+ _t('MemberImportForm.ResultCreated', 'Created %d members'),
+ $result->CreatedCount()
+ );
+ if($result->UpdatedCount()) $msgArr[] = sprintf(
+ _t('MemberImportForm.ResultUpdated', 'Updated %d members'),
+ $result->UpdatedCount()
+ );
+ if($result->DeletedCount()) $msgArr[] = sprintf(
+ _t('MemberImportForm.ResultDeleted', 'Deleted %d members'),
+ $result->DeletedCount()
+ );
+ $msg = ($msgArr) ? implode(',', $msgArr) : _t('MemberImportForm.ResultNone', 'No changes');
+
+ $this->sessionMessage($msg, 'good');
+
+ Director::redirectBack();
+ }
+
+ /**
+ * @param $group Group
+ */
+ function setGroup($group) {
+ $this->group = $group;
+ }
+
+ /**
+ * @return Group
+ */
+ function getGroup($group) {
+ return $this->group;
+ }
+}
+?>
View
46 code/SecurityAdmin.php
@@ -24,6 +24,8 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider {
'AddRecordForm',
'MemberForm',
'EditForm',
+ 'MemberImportForm',
+ 'memberimport'
);
/**
@@ -42,6 +44,21 @@ public function init() {
function getEditForm($id = null) {
$form = parent::getEditForm($id);
+ $fields = $form->Fields();
+
+ if($fields->hasTabSet()) {
+ $fields->findOrMakeTab('Root.Import',_t('Group.IMPORTTABTITLE', 'Import'));
+ $fields->addFieldToTab('Root.Import',
+ new LiteralField(
+ 'MemberImportFormIframe',
+ sprintf(
+ '<iframe src="%s" id="MemberImportFormIframe" width="100%%" height="400px" border="0"></iframe>',
+ $this->Link('memberimport')
+ )
+ )
+ );
+ }
+
$form->Actions()->insertBefore(
new FormAction('addmember',_t('SecurityAdmin.ADDMEMBER','Add Member')),
'action_save'
@@ -53,6 +70,35 @@ function getEditForm($id = null) {
return $form;
}
+
+ public function memberimport() {
+ Requirements::clear();
+ Requirements::css(SAPPHIRE_DIR . '/css/Form.css');
+ Requirements::css(CMS_DIR . '/css/typography.css');
+ Requirements::css(CMS_DIR . '/css/cms_right.css');
+
+ Requirements::javascript(CMS_DIR . '/javascript/MemberImportForm.js');
+
+ return $this->renderWith('BlankPage', array(
+ 'Form' => $this->MemberImportForm()
+ ));
+ }
+
+ /**
+ * @see SecurityAdmin_MemberImportForm
+ *
+ * @return Form
+ */
+ public function MemberImportForm() {
+ $group = $this->currentPage();
+ $form = new MemberImportForm(
+ $this,
+ 'MemberImportForm'
+ );
+ $form->setGroup($group);
+
+ return $form;
+ }
public function AddRecordForm() {
$m = Object::create('MemberTableField',
View
14 javascript/SecurityAdmin.js
@@ -1,4 +1,18 @@
(function($) {
+
+ /**
+ * Refresh the member listing every time the import iframe is loaded,
+ * which is most likely a form submission.
+ */
+ $(window).bind('load', function(e) {
+ $('#MemberImportFormIframe').bind('load', function(e) {
+ // Check for a message <div>, an indication that the form has been submitted.
+ if($($(this).contents()).find('.message').length) {
+ $(window.parent.document).find('#Form_EditForm_Members').get(0).refresh();
+ }
+ });
+ })
+
/**
* Delete selected folders through "batch actions" tab.
*/
View
21 tests/MemberImportFormTest.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * @package cms
+ * @subpackage tests
+ */
+class MemberImportFormTest extends SapphireTest {
+
+ function testLoad() {
+ $form = new MemberImportForm(
+ new Controller(),
+ 'Form'
+ );
+ $data = array(
+ 'CsvFile' => array(
+ 'tmp_name' => 'cms/tests/MemberImportFormTest.yml'
+ )
+ );
+ $form->doImport($data, $form);
+ }
+
+}
View
3  tests/MemberImportFormTest.yml
@@ -0,0 +1,3 @@
+FirstName,Surname,Email,Password,PasswordEncryption,Salt,PasswordExpiry,Groups
+author1_first,author1_last,author1@test.com,21bb196c4d488023cb4e4b9df5f687c9a4d40172,sha1_v2.4,c23a94a878aa825cee69136bfd6185a874bc68801257978194,,existinggroup
+author2_first,author2_last,author2@test.com,069b6b22dcaded75c045b7e5ceb5d1dd743f9cac,sha1_v2.4,7e8ea602668b5631bac4baaf7174f9966b6d34571257978210,,"existinggroup,newgroup"
Please sign in to comment.
Something went wrong with that request. Please try again.