Completed
Push — master ( c54e22...e7a101 )
by Bart
03:24
created

ExportController::exportToSingle()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 0
cts 6
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
crap 2
1
<?php
2
3
namespace NerdsAndCompany\Schematic\Controllers;
4
5
use Craft;
6
use craft\helpers\FileHelper;
7
use NerdsAndCompany\Schematic\Models\Data;
8
use NerdsAndCompany\Schematic\Schematic;
9
10
/**
11
 * Schematic Export Controller.
12
 *
13
 * Sync Craft Setups.
14
 *
15
 * @author    Nerds & Company
16
 * @copyright Copyright (c) 2015-2019, Nerds & Company
17
 * @license   MIT
18
 *
19
 * @see      http://www.nerds.company
20
 */
21
class ExportController extends Base
22
{
23
    /**
24
     * Exports the Craft datamodel.
25
     *
26
     * @return int
27
     * @throws \yii\base\ErrorException
28
     */
29
    public function actionIndex(): int
30
    {
31
        $this->disableLogging();
32
33
        $configurations = [];
34
        foreach ($this->getDataTypes() as $dataTypeHandle) {
35
            $dataType = $this->module->getDataType($dataTypeHandle);
36
            if (null == $dataType) {
37
                continue;
38
            }
39
40
            $mapper = $dataType->getMapperHandle();
41
            if (!$this->module->checkMapper($mapper)) {
42
                continue;
43
            }
44
45
            $records = $dataType->getRecords();
46
            $configurations[$dataTypeHandle] = $this->module->$mapper->export($records);
47
        }
48
49
        // Load override file.
50
        $overrideData = [];
51
        if (file_exists($this->overrideFile)) {
52
            // Parse data in the overrideFile if available.
53
            $overrideData = Data::parseYamlFile($this->overrideFile);
54
        }
55
56
        // Export the configuration to a single file.
57
        if ($this->getStorageType() === self::SINGLE_FILE) {
58
            $this->exportToSingle($configurations, $overrideData);
59
        }
60
61
        // Export the configuration to multiple yaml files.
62
        if ($this->getStorageType() === self::MULTIPLE_FILES) {
63
            $this->exportToMultiple($configurations, $overrideData);
64
        }
65
66
        return 0;
67
    }
68
69
    /**
70
     * Export schema to single file
71
     *
72
     * @param array $configurations configurations to export
73
     * @param array $overrideData   overridden configurations
74
     */
75
    private function exportToSingle(array $configurations, array $overrideData)
76
    {
77
        $configurations = array_replace_recursive($configurations, $overrideData);
78
        FileHelper::writeToFile($this->file, Data::toYaml($configurations));
79
        Schematic::info('Exported schema to '.$this->file);
80
    }
81
82
    /**
83
     * Export schema to multiple files
84
     *
85
     * @param array $configurations configurations to export
86
     * @param array $overrideData   overridden configurations
87
     */
88
    private function exportToMultiple(array $configurations, array $overrideData)
89
    {
90
        // Create export directory if it doesn't exist.
91
        if (!file_exists($this->path)) {
92
            mkdir($this->path, 2775, true);
93
        }
94
95
        foreach ($configurations as $dataTypeHandle => $configuration) {
96
            Schematic::info('Exporting '.$dataTypeHandle);
97
            foreach ($configuration as $recordName => $records) {
98
                // Check if there is data in the override file for the current record.
99
                if (isset($overrideData[$dataTypeHandle][$recordName])) {
100
                    $records = array_replace_recursive($records, $overrideData[$dataTypeHandle][$recordName]);
101
                }
102
103
                // Export records to file.
104
                $fileName = $this->toSafeFileName($dataTypeHandle.'.'.$recordName.'.yml');
105
                FileHelper::writeToFile($this->path.$fileName, Data::toYaml($records));
106
                Schematic::info('Exported '.$recordName.' to '.$fileName);
107
            }
108
        }
109
    }
110
}
111