Permalink
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...
1 parent 5cd476c commit 89c926221f34db78baada582cae649ba5980d968 @chillu chillu committed Feb 10, 2010
View
@@ -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
@@ -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',
@@ -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.
*/
@@ -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);
+ }
+
+}
@@ -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"

0 comments on commit 89c9262

Please sign in to comment.