silverstripe-framework/docs/en/02_Developer_Guides/11_Integration/How_Tos/Import_CSV_through_a_Controller.md
2017-08-07 14:01:38 +12:00

1.7 KiB

title: Import CSV Data through a Controller

Import CSV Data through a Controller

You can have more customised logic and interface feedback through a custom controller. Let's create a simple upload form (which is used for MyDataObject instances). You can access it through http://yoursite.com/MyController/?flush=all.


	<?php

	class MyController extends Controller {

		private static $allowed_actions = array(
			'Form'
		);

		protected $template = "BlankPage";

		public function Link($action = null) {
			return Controller::join_links('MyController', $action);
		}

		public function Form() {
			$form = new Form(
				$this,
				'Form',
				new FieldList(
					new FileField('CsvFile', false)
				),
				new FieldList(
					new FormAction('doUpload', 'Upload')
				),
				new RequiredFields()
			);
			return $form;
		}

		public function doUpload($data, $form) {
			$loader = new CsvBulkLoader('MyDataObject');
			$results = $loader->load($_FILES['CsvFile']['tmp_name']);
			$messages = array();

			if($results->CreatedCount()) {
				$messages[] = sprintf('Imported %d items', $results->CreatedCount());
			}

			if($results->UpdatedCount()) {
				$messages[] = sprintf('Updated %d items', $results->UpdatedCount());
			}

			if($results->DeletedCount()) {
				$messages[] = sprintf('Deleted %d items', $results->DeletedCount());
			}

			if(!$messages) {
				$messages[] = 'No changes';
			}

			$form->sessionMessage(implode(', ', $messages), 'good');

			return $this->redirectBack();
		}
	}
This interface is not secured, consider using [Permission::check()](api:SilverStripe\Security\Permission::check()) to limit the controller to users with certain access rights.