|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace Kaliop\eZMigrationBundle\Core\Executor; |
|
4
|
|
|
|
|
5
|
|
|
use eZ\Publish\API\Repository\Exceptions\NotFoundException; |
|
6
|
|
|
use Kaliop\eZMigrationBundle\API\Collection\LanguageCollection; |
|
7
|
|
|
|
|
8
|
|
|
/** |
|
9
|
|
|
* Handles language migrations. |
|
10
|
|
|
*/ |
|
11
|
|
|
class LanguageManager extends RepositoryExecutor |
|
12
|
|
|
{ |
|
13
|
|
|
protected $supportedStepTypes = array('language'); |
|
14
|
|
|
protected $supportedActions = array('create', 'delete', 'upsert'); |
|
15
|
|
|
|
|
16
|
|
|
/** |
|
17
|
|
|
* Handles the language create migration action |
|
18
|
2 |
|
*/ |
|
19
|
|
|
protected function create($step) |
|
20
|
2 |
|
{ |
|
21
|
|
View Code Duplication |
foreach (array('lang', 'name') as $key) { |
|
|
|
|
|
|
22
|
2 |
|
if (!isset($step->dsl[$key])) { |
|
23
|
|
|
throw new \Exception("The '$key' key is missing in a language creation definition"); |
|
24
|
|
|
} |
|
25
|
|
|
} |
|
26
|
2 |
|
$languageService = $this->repository->getContentLanguageService(); |
|
27
|
2 |
|
$languageCreateStruct = $languageService->newLanguageCreateStruct(); |
|
28
|
2 |
|
$languageCreateStruct->languageCode = $step->dsl['lang']; |
|
29
|
2 |
|
$languageCreateStruct->name = $step->dsl['name']; |
|
30
|
|
|
if (isset($step->dsl['enabled'])) { |
|
31
|
2 |
|
$languageCreateStruct->enabled = (bool)$step->dsl['enabled']; |
|
32
|
|
|
} |
|
33
|
|
|
$language = $languageService->createLanguage($languageCreateStruct); |
|
34
|
2 |
|
|
|
35
|
|
|
$this->setReferences($language, $step); |
|
36
|
2 |
|
|
|
37
|
|
|
return $language; |
|
38
|
2 |
|
} |
|
39
|
|
|
|
|
40
|
|
|
/** |
|
41
|
|
|
* Handles the language update migration action |
|
42
|
|
|
* |
|
43
|
|
|
* @todo use a matcher for flexible matching? |
|
44
|
|
|
*/ |
|
45
|
|
|
protected function update($step) |
|
|
|
|
|
|
46
|
|
|
{ |
|
47
|
|
|
throw new \Exception('Language update is not implemented yet'); |
|
48
|
|
|
|
|
49
|
|
|
/*$languageService = $this->repository->getContentLanguageService(); |
|
|
|
|
|
|
50
|
|
|
|
|
51
|
|
|
if (!isset($step->dsl['lang'])) { |
|
52
|
|
|
throw new \Exception("The 'lang' key is required to update a language."); |
|
53
|
|
|
} |
|
54
|
|
|
|
|
55
|
|
|
$this->setReferences($language, $step);*/ |
|
56
|
|
|
} |
|
57
|
|
|
|
|
58
|
|
|
/** |
|
59
|
|
|
* Handles the language delete migration action |
|
60
|
|
|
* |
|
61
|
|
|
* @todo use a matcher for flexible matching? |
|
62
|
|
|
*/ |
|
63
|
|
|
protected function delete($step) |
|
64
|
1 |
|
{ |
|
65
|
|
|
if (!isset($step->dsl['lang'])) { |
|
66
|
1 |
|
throw new \Exception("The 'lang' key is required to delete a language."); |
|
67
|
|
|
} |
|
68
|
|
|
|
|
69
|
|
|
$languageService = $this->repository->getContentLanguageService(); |
|
70
|
1 |
|
$language = $languageService->loadLanguage($step->dsl['lang']); |
|
71
|
1 |
|
|
|
72
|
|
|
$languageService->deleteLanguage($language); |
|
73
|
1 |
|
|
|
74
|
|
|
return $language; |
|
75
|
1 |
|
} |
|
76
|
|
|
|
|
77
|
|
|
/** |
|
78
|
|
|
* Method that create a language if it doesn't already exist. |
|
79
|
|
|
*/ |
|
80
|
|
|
protected function upsert($step) |
|
81
|
|
|
{ |
|
82
|
|
View Code Duplication |
foreach (array('lang', 'name') as $key) { |
|
|
|
|
|
|
83
|
|
|
if (!isset($step->dsl[$key])) { |
|
84
|
|
|
throw new \Exception("The '$key' key is missing in a language upsert definition"); |
|
85
|
2 |
|
} |
|
86
|
|
|
} |
|
87
|
2 |
|
|
|
88
|
1 |
|
$languageService = $this->repository->getContentLanguageService(); |
|
89
|
|
|
|
|
90
|
|
|
try { |
|
91
|
1 |
|
$language = $languageService->loadLanguage($step->dsl['lang']); |
|
92
|
1 |
|
|
|
93
|
|
|
return $language; |
|
94
|
1 |
|
} catch (NotFoundException $e) { |
|
95
|
|
|
return $this->create($step); |
|
96
|
1 |
|
} |
|
97
|
1 |
|
} |
|
98
|
1 |
|
|
|
99
|
1 |
|
/** |
|
100
|
1 |
|
* Sets references to certain language attributes. |
|
101
|
|
|
* |
|
102
|
|
|
* @param \eZ\Publish\API\Repository\Values\Content\Language|LanguageCollection $language |
|
103
|
|
|
* @throws \InvalidArgumentException When trying to set a reference to an unsupported attribute |
|
104
|
|
|
* @return boolean |
|
105
|
|
|
*/ |
|
106
|
|
View Code Duplication |
protected function setReferences($language, $step) |
|
|
|
|
|
|
107
|
|
|
{ |
|
108
|
|
|
if (!array_key_exists('references', $step->dsl)) { |
|
109
|
|
|
return false; |
|
110
|
|
|
} |
|
111
|
|
|
|
|
112
|
|
|
$references = $this->setReferencesCommon($language, $step->dsl['references']); |
|
113
|
|
|
$language = $this->insureSingleEntity($language, $references); |
|
114
|
|
|
|
|
115
|
1 |
|
foreach ($references as $reference) { |
|
116
|
1 |
|
|
|
117
|
|
|
switch ($reference['attribute']) { |
|
118
|
|
|
case 'language_id': |
|
119
|
1 |
|
case 'id': |
|
120
|
|
|
$value = $language->id; |
|
121
|
|
|
break; |
|
122
|
1 |
|
case 'enabled': |
|
123
|
|
|
$value = $language->enabled; |
|
124
|
|
|
break; |
|
125
|
|
|
case 'language_code': |
|
126
|
|
|
$value = $language->languageCode; |
|
127
|
|
|
break; |
|
128
|
|
|
case 'language_name': |
|
129
|
|
|
case 'name': |
|
130
|
|
|
$value = $language->name; |
|
131
|
|
|
break; |
|
132
|
|
|
default: |
|
133
|
|
|
throw new \InvalidArgumentException('Language Manager does not support setting references for attribute ' . $reference['attribute']); |
|
134
|
|
|
} |
|
135
|
|
|
|
|
136
|
|
|
$overwrite = false; |
|
137
|
|
|
if (isset($reference['overwrite'])) { |
|
138
|
|
|
$overwrite = $reference['overwrite']; |
|
139
|
|
|
} |
|
140
|
|
|
$this->referenceResolver->addReference($reference['identifier'], $value, $overwrite); |
|
141
|
|
|
} |
|
142
|
|
|
|
|
143
|
|
|
return true; |
|
144
|
|
|
} |
|
145
|
|
|
} |
|
146
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.