-
Notifications
You must be signed in to change notification settings - Fork 70
/
WorkflowBulkLoader.php
108 lines (93 loc) · 3.44 KB
/
WorkflowBulkLoader.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
<?php
namespace Symbiote\AdvancedWorkflow\Dev;
use SilverStripe\Control\Controller;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Dev\BulkLoader;
use SilverStripe\Dev\BulkLoader_Result;
use SilverStripe\ORM\ValidationException;
use Symbiote\AdvancedWorkflow\Admin\WorkflowDefinitionExporter;
use Symbiote\AdvancedWorkflow\Admin\WorkflowDefinitionImporter;
use Symbiote\AdvancedWorkflow\DataObjects\ImportedWorkflowTemplate;
use Symbiote\AdvancedWorkflow\DataObjects\WorkflowDefinition;
use Symbiote\AdvancedWorkflow\Services\WorkflowService;
use Symbiote\AdvancedWorkflow\Templates\WorkflowTemplate;
/**
* Utility class to facilitate a simple YML-import via the standard CMS ImportForm() logic.
*
* @license BSD License (http://silverstripe.org/bsd-license/)
* @package advancedworkflow
*/
class WorkflowBulkLoader extends BulkLoader
{
/**
* @inheritDoc
*/
public function preview($filepath)
{
return $this->processAll($filepath, true);
}
/**
* @param string $filepath
* @param boolean $preview
*/
protected function processAll($filepath, $preview = false)
{
$results = new BulkLoader_Result();
try {
$yml = singleton(WorkflowDefinitionImporter::class)->parseYAMLImport($filepath);
$this->processRecord($yml, $this->columnMap, $results, $preview);
return $results;
} catch (ValidationException $e) {
return new BulkLoader_Result();
}
}
/**
* @param array $record
* @param array $columnMap
* @param BulkLoader_Result $results
* @param boolean $preview
* @return number
*/
protected function processRecord($record, $columnMap, &$results, $preview = false)
{
$posted = Controller::curr()->getRequest()->postVars();
$default = WorkflowDefinitionExporter::$export_filename_prefix.'0.yml';
$filename = (isset($posted['_CsvFile']['name']) ? $posted['_CsvFile']['name'] : $default);
// @todo is this the best way to extract records (nested array keys)??
$struct = $record[Injector::class]['ExportedWorkflow'];
$name = $struct['constructor'][0];
$import = $this->createImport($name, $filename, $record);
$template = Injector::inst()->createWithArgs(WorkflowTemplate::class, $struct['constructor']);
$template->setStructure($struct['properties']['structure']);
$def = WorkflowDefinition::create();
$def->workflowService = singleton(WorkflowService::class);
$def->Template = $template->getName();
$obj = $def->workflowService->defineFromTemplate($def, $def->Template);
$results->addCreated($obj, '');
$objID = $obj->ID;
// Update the import
$import->DefinitionID = $objID;
$import->write();
$obj->destroy();
unset($obj);
return $objID;
}
/**
* Create the ImportedWorkflowTemplate record for the uploaded YML file.
*
* @param string $name
* @param string $filename
* @param array $record
* @return ImportedWorkflowTemplate $import
*/
protected function createImport($name, $filename, $record)
{
// This is needed to feed WorkflowService#getNamedTemplate()
$import = ImportedWorkflowTemplate::create();
$import->Name = $name;
$import->Filename = $filename;
$import->Content = serialize($record);
$import->write();
return $import;
}
}