Completed
Push — master ( 94e820...3f0fe0 )
by Thomas
10:39
created

LocalizationDomainTrait::setLanguageId()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 25
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 25
rs 8.8571
cc 3
eloc 15
nc 3
nop 2
1
<?php
2
namespace keeko\core\domain\base;
3
4
use keeko\core\model\Localization;
5
use keeko\core\model\LocalizationQuery;
6
use keeko\framework\service\ServiceContainer;
7
use keeko\framework\domain\payload\PayloadInterface;
8
use phootwork\collection\Map;
9
use keeko\framework\domain\payload\Found;
10
use keeko\framework\domain\payload\NotFound;
11
use keeko\framework\utils\Parameters;
12
use keeko\framework\utils\NameUtils;
13
use keeko\core\event\LocalizationEvent;
14
use keeko\framework\domain\payload\Created;
15
use keeko\framework\domain\payload\NotValid;
16
use keeko\framework\domain\payload\Updated;
17
use keeko\framework\domain\payload\NotUpdated;
18
use keeko\framework\domain\payload\Deleted;
19
use keeko\framework\domain\payload\NotDeleted;
20
use keeko\core\model\LanguageVariantQuery;
21
use keeko\core\model\LocalizationVariantQuery;
22
use keeko\core\model\ApplicationUriQuery;
23
24
/**
25
 */
26
trait LocalizationDomainTrait {
27
28
	/**
29
	 */
30
	protected $pool;
31
32
	/**
33
	 * Adds ApplicationUris to Localization
34
	 * 
35
	 * @param mixed $id
36
	 * @param mixed $data
37
	 * @return PayloadInterface
38
	 */
39
	public function addApplicationUris($id, $data) {
40
		// find
41
		$localization = $this->get($id);
42
43
		if ($localization === null) {
44
			return new NotFound(['message' => 'Localization not found.']);
45
		}
46
		 
47
		// update
48
		$errors = [];
49
		foreach ($data as $entry) {
50
			if (!isset($entry['id'])) {
51
				$errors[] = 'Missing id for ApplicationUri';
52
			}
53
			$applicationUri = ApplicationUriQuery::create()->findOneById($entry['id']);
54
			$localization->addApplicationUri($applicationUri);
55
		}
56
57
		if (count($errors) > 0) {
58
			return new NotValid(['errors' => $errors]);
59
		}
60
61
		// save and dispatch events
62
		$event = new LocalizationEvent($localization);
63
		$dispatcher = $this->getServiceContainer()->getDispatcher();
64
		$dispatcher->dispatch(LocalizationEvent::PRE_APPLICATION_URIS_ADD, $event);
65
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
66
		$rows = $localization->save();
67
		$dispatcher->dispatch(LocalizationEvent::POST_APPLICATION_URIS_ADD, $event);
68
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
69
70
		if ($rows > 0) {
71
			return Updated(['model' => $localization]);
72
		}
73
74
		return NotUpdated(['model' => $localization]);
75
	}
76
77
	/**
78
	 * Adds LanguageVariants to Localization
79
	 * 
80
	 * @param mixed $id
81
	 * @param mixed $data
82
	 * @return PayloadInterface
83
	 */
84
	public function addLanguageVariants($id, $data) {
85
		// find
86
		$localization = $this->get($id);
87
88
		if ($localization === null) {
89
			return new NotFound(['message' => 'Localization not found.']);
90
		}
91
		 
92
		// update
93
		$errors = [];
94
		foreach ($data as $entry) {
95
			if (!isset($entry['id'])) {
96
				$errors[] = 'Missing id for LanguageVariant';
97
			}
98
			$languageVariant = LanguageVariantQuery::create()->findOneById($entry['id']);
99
			$localization->addLanguageVariant($languageVariant);
100
		}
101
102
		if (count($errors) > 0) {
103
			return new NotValid(['errors' => $errors]);
104
		}
105
106
		// save and dispatch events
107
		$event = new LocalizationEvent($localization);
108
		$dispatcher = $this->getServiceContainer()->getDispatcher();
109
		$dispatcher->dispatch(LocalizationEvent::PRE_LANGUAGE_VARIANTS_ADD, $event);
110
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
111
		$rows = $localization->save();
112
		$dispatcher->dispatch(LocalizationEvent::POST_LANGUAGE_VARIANTS_ADD, $event);
113
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
114
115
		if ($rows > 0) {
116
			return Updated(['model' => $localization]);
117
		}
118
119
		return NotUpdated(['model' => $localization]);
120
	}
121
122
	/**
123
	 * Adds Localizations to Localization
124
	 * 
125
	 * @param mixed $id
126
	 * @param mixed $data
127
	 * @return PayloadInterface
128
	 */
129
	public function addLocalizations($id, $data) {
130
		// find
131
		$localization = $this->get($id);
132
133
		if ($localization === null) {
134
			return new NotFound(['message' => 'Localization not found.']);
135
		}
136
		 
137
		// update
138
		$errors = [];
139
		foreach ($data as $entry) {
140
			if (!isset($entry['id'])) {
141
				$errors[] = 'Missing id for Localization';
142
			}
143
			$localization = LocalizationQuery::create()->findOneById($entry['id']);
144
			$localization->addLocalization($localization);
145
		}
146
147
		if (count($errors) > 0) {
148
			return new NotValid(['errors' => $errors]);
149
		}
150
151
		// save and dispatch events
152
		$event = new LocalizationEvent($localization);
153
		$dispatcher = $this->getServiceContainer()->getDispatcher();
154
		$dispatcher->dispatch(LocalizationEvent::PRE_LOCALIZATIONS_ADD, $event);
155
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
156
		$rows = $localization->save();
157
		$dispatcher->dispatch(LocalizationEvent::POST_LOCALIZATIONS_ADD, $event);
158
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
159
160
		if ($rows > 0) {
161
			return Updated(['model' => $localization]);
162
		}
163
164
		return NotUpdated(['model' => $localization]);
165
	}
166
167
	/**
168
	 * Creates a new Localization with the provided data
169
	 * 
170
	 * @param mixed $data
171
	 * @return PayloadInterface
172
	 */
173
	public function create($data) {
174
		// hydrate
175
		$serializer = Localization::getSerializer();
176
		$localization = $serializer->hydrate(new Localization(), $data);
177
178
		// validate
179
		$validator = $this->getValidator();
0 ignored issues
show
Bug introduced by
It seems like getValidator() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
180
		if ($validator !== null && !$validator->validate($localization)) {
181
			return new NotValid([
182
				'errors' => $validator->getValidationFailures()
183
			]);
184
		}
185
186
		// dispatch
187
		$event = new LocalizationEvent($localization);
188
		$dispatcher = $this->getServiceContainer()->getDispatcher();
189
		$dispatcher->dispatch(LocalizationEvent::PRE_CREATE, $event);
190
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
191
		$localization->save();
192
		$dispatcher->dispatch(LocalizationEvent::POST_CREATE, $event);
193
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
194
		return new Created(['model' => $localization]);
195
	}
196
197
	/**
198
	 * Deletes a Localization with the given id
199
	 * 
200
	 * @param mixed $id
201
	 * @return PayloadInterface
202
	 */
203
	public function delete($id) {
204
		// find
205
		$localization = $this->get($id);
206
207
		if ($localization === null) {
208
			return new NotFound(['message' => 'Localization not found.']);
209
		}
210
211
		// delete
212
		$event = new LocalizationEvent($localization);
213
		$dispatcher = $this->getServiceContainer()->getDispatcher();
214
		$dispatcher->dispatch(LocalizationEvent::PRE_DELETE, $event);
215
		$localization->delete();
216
217
		if ($localization->isDeleted()) {
218
			$dispatcher->dispatch(LocalizationEvent::POST_DELETE, $event);
219
			return new Deleted(['model' => $localization]);
220
		}
221
222
		return new NotDeleted(['message' => 'Could not delete Localization']);
223
	}
224
225
	/**
226
	 * Returns a paginated result
227
	 * 
228
	 * @param Parameters $params
229
	 * @return PayloadInterface
230
	 */
231
	public function paginate(Parameters $params) {
232
		$sysPrefs = $this->getServiceContainer()->getPreferenceLoader()->getSystemPreferences();
233
		$defaultSize = $sysPrefs->getPaginationSize();
234
		$page = $params->getPage('number');
235
		$size = $params->getPage('size', $defaultSize);
236
237
		$query = LocalizationQuery::create();
238
239
		// sorting
240
		$sort = $params->getSort(Localization::getSerializer()->getSortFields());
241
		foreach ($sort as $field => $order) {
242
			$method = 'orderBy' . NameUtils::toStudlyCase($field);
243
			$query->$method($order);
244
		}
245
246
		// filtering
247
		$filter = $params->getFilter();
248
		if (!empty($filter)) {
249
			$this->applyFilter($query, $filter);
250
		}
251
252
		// paginate
253
		$localization = $query->paginate($page, $size);
254
255
		// run response
256
		return new Found(['model' => $localization]);
257
	}
258
259
	/**
260
	 * Returns one Localization with the given id
261
	 * 
262
	 * @param mixed $id
263
	 * @return PayloadInterface
264
	 */
265
	public function read($id) {
266
		// read
267
		$localization = $this->get($id);
268
269
		// check existence
270
		if ($localization === null) {
271
			return new NotFound(['message' => 'Localization not found.']);
272
		}
273
274
		return new Found(['model' => $localization]);
275
	}
276
277
	/**
278
	 * Removes ApplicationUris from Localization
279
	 * 
280
	 * @param mixed $id
281
	 * @param mixed $data
282
	 * @return PayloadInterface
283
	 */
284
	public function removeApplicationUris($id, $data) {
285
		// find
286
		$localization = $this->get($id);
287
288
		if ($localization === null) {
289
			return new NotFound(['message' => 'Localization not found.']);
290
		}
291
292
		// remove them
293
		$errors = [];
294
		foreach ($data as $entry) {
295
			if (!isset($entry['id'])) {
296
				$errors[] = 'Missing id for ApplicationUri';
297
			}
298
			$applicationUri = ApplicationUriQuery::create()->findOneById($entry['id']);
299
			$localization->removeApplicationUri($applicationUri);
300
		}
301
302
		if (count($errors) > 0) {
303
			return new NotValid(['errors' => $errors]);
304
		}
305
306
		// save and dispatch events
307
		$event = new LocalizationEvent($localization);
308
		$dispatcher = $this->getServiceContainer()->getDispatcher();
309
		$dispatcher->dispatch(LocalizationEvent::PRE_APPLICATION_URIS_REMOVE, $event);
310
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
311
		$rows = $localization->save();
312
		$dispatcher->dispatch(LocalizationEvent::POST_APPLICATION_URIS_REMOVE, $event);
313
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
314
315
		if ($rows > 0) {
316
			return Updated(['model' => $localization]);
317
		}
318
319
		return NotUpdated(['model' => $localization]);
320
	}
321
322
	/**
323
	 * Removes LanguageVariants from Localization
324
	 * 
325
	 * @param mixed $id
326
	 * @param mixed $data
327
	 * @return PayloadInterface
328
	 */
329
	public function removeLanguageVariants($id, $data) {
330
		// find
331
		$localization = $this->get($id);
332
333
		if ($localization === null) {
334
			return new NotFound(['message' => 'Localization not found.']);
335
		}
336
337
		// remove them
338
		$errors = [];
339
		foreach ($data as $entry) {
340
			if (!isset($entry['id'])) {
341
				$errors[] = 'Missing id for LanguageVariant';
342
			}
343
			$languageVariant = LanguageVariantQuery::create()->findOneById($entry['id']);
344
			$localization->removeLanguageVariant($languageVariant);
345
		}
346
347
		if (count($errors) > 0) {
348
			return new NotValid(['errors' => $errors]);
349
		}
350
351
		// save and dispatch events
352
		$event = new LocalizationEvent($localization);
353
		$dispatcher = $this->getServiceContainer()->getDispatcher();
354
		$dispatcher->dispatch(LocalizationEvent::PRE_LANGUAGE_VARIANTS_REMOVE, $event);
355
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
356
		$rows = $localization->save();
357
		$dispatcher->dispatch(LocalizationEvent::POST_LANGUAGE_VARIANTS_REMOVE, $event);
358
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
359
360
		if ($rows > 0) {
361
			return Updated(['model' => $localization]);
362
		}
363
364
		return NotUpdated(['model' => $localization]);
365
	}
366
367
	/**
368
	 * Removes Localizations from Localization
369
	 * 
370
	 * @param mixed $id
371
	 * @param mixed $data
372
	 * @return PayloadInterface
373
	 */
374
	public function removeLocalizations($id, $data) {
375
		// find
376
		$localization = $this->get($id);
377
378
		if ($localization === null) {
379
			return new NotFound(['message' => 'Localization not found.']);
380
		}
381
382
		// remove them
383
		$errors = [];
384
		foreach ($data as $entry) {
385
			if (!isset($entry['id'])) {
386
				$errors[] = 'Missing id for Localization';
387
			}
388
			$localization = LocalizationQuery::create()->findOneById($entry['id']);
389
			$localization->removeLocalization($localization);
390
		}
391
392
		if (count($errors) > 0) {
393
			return new NotValid(['errors' => $errors]);
394
		}
395
396
		// save and dispatch events
397
		$event = new LocalizationEvent($localization);
398
		$dispatcher = $this->getServiceContainer()->getDispatcher();
399
		$dispatcher->dispatch(LocalizationEvent::PRE_LOCALIZATIONS_REMOVE, $event);
400
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
401
		$rows = $localization->save();
402
		$dispatcher->dispatch(LocalizationEvent::POST_LOCALIZATIONS_REMOVE, $event);
403
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
404
405
		if ($rows > 0) {
406
			return Updated(['model' => $localization]);
407
		}
408
409
		return NotUpdated(['model' => $localization]);
410
	}
411
412
	/**
413
	 * Sets the ExtLang id
414
	 * 
415
	 * @param mixed $id
416
	 * @param mixed $extLangId
417
	 * @return PayloadInterface
418
	 */
419
	public function setExtLangId($id, $extLangId) {
420
		// find
421
		$localization = $this->get($id);
422
423
		if ($localization === null) {
424
			return new NotFound(['message' => 'Localization not found.']);
425
		}
426
427
		// update
428
		if ($localization->getExtLanguageId() !== $extLangId) {
429
			$localization->setExtLanguageId($extLangId);
430
431
			$event = new LocalizationEvent($localization);
432
			$dispatcher = $this->getServiceContainer()->getDispatcher();
433
			$dispatcher->dispatch(LocalizationEvent::PRE_EXT_LANG_UPDATE, $event);
434
			$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
435
			$localization->save();
436
			$dispatcher->dispatch(LocalizationEvent::POST_EXT_LANG_UPDATE, $event);
437
			$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
438
			
439
			return Updated(['model' => $localization]);
440
		}
441
442
		return NotUpdated(['model' => $localization]);
443
	}
444
445
	/**
446
	 * Sets the Language id
447
	 * 
448
	 * @param mixed $id
449
	 * @param mixed $languageId
450
	 * @return PayloadInterface
451
	 */
452
	public function setLanguageId($id, $languageId) {
453
		// find
454
		$localization = $this->get($id);
455
456
		if ($localization === null) {
457
			return new NotFound(['message' => 'Localization not found.']);
458
		}
459
460
		// update
461
		if ($localization->getLanguageId() !== $languageId) {
462
			$localization->setLanguageId($languageId);
463
464
			$event = new LocalizationEvent($localization);
465
			$dispatcher = $this->getServiceContainer()->getDispatcher();
466
			$dispatcher->dispatch(LocalizationEvent::PRE_LANGUAGE_UPDATE, $event);
467
			$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
468
			$localization->save();
469
			$dispatcher->dispatch(LocalizationEvent::POST_LANGUAGE_UPDATE, $event);
470
			$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
471
			
472
			return Updated(['model' => $localization]);
473
		}
474
475
		return NotUpdated(['model' => $localization]);
476
	}
477
478
	/**
479
	 * Sets the Parent id
480
	 * 
481
	 * @param mixed $id
482
	 * @param mixed $parentId
483
	 * @return PayloadInterface
484
	 */
485
	public function setParentId($id, $parentId) {
486
		// find
487
		$localization = $this->get($id);
488
489
		if ($localization === null) {
490
			return new NotFound(['message' => 'Localization not found.']);
491
		}
492
493
		// update
494
		if ($localization->getParentId() !== $parentId) {
495
			$localization->setParentId($parentId);
496
497
			$event = new LocalizationEvent($localization);
498
			$dispatcher = $this->getServiceContainer()->getDispatcher();
499
			$dispatcher->dispatch(LocalizationEvent::PRE_PARENT_UPDATE, $event);
500
			$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
501
			$localization->save();
502
			$dispatcher->dispatch(LocalizationEvent::POST_PARENT_UPDATE, $event);
503
			$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
504
			
505
			return Updated(['model' => $localization]);
506
		}
507
508
		return NotUpdated(['model' => $localization]);
509
	}
510
511
	/**
512
	 * Sets the Script id
513
	 * 
514
	 * @param mixed $id
515
	 * @param mixed $scriptId
516
	 * @return PayloadInterface
517
	 */
518
	public function setScriptId($id, $scriptId) {
519
		// find
520
		$localization = $this->get($id);
521
522
		if ($localization === null) {
523
			return new NotFound(['message' => 'Localization not found.']);
524
		}
525
526
		// update
527
		if ($localization->getScriptId() !== $scriptId) {
528
			$localization->setScriptId($scriptId);
529
530
			$event = new LocalizationEvent($localization);
531
			$dispatcher = $this->getServiceContainer()->getDispatcher();
532
			$dispatcher->dispatch(LocalizationEvent::PRE_SCRIPT_UPDATE, $event);
533
			$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
534
			$localization->save();
535
			$dispatcher->dispatch(LocalizationEvent::POST_SCRIPT_UPDATE, $event);
536
			$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
537
			
538
			return Updated(['model' => $localization]);
539
		}
540
541
		return NotUpdated(['model' => $localization]);
542
	}
543
544
	/**
545
	 * Updates a Localization with the given idand the provided data
546
	 * 
547
	 * @param mixed $id
548
	 * @param mixed $data
549
	 * @return PayloadInterface
550
	 */
551
	public function update($id, $data) {
552
		// find
553
		$localization = $this->get($id);
554
555
		if ($localization === null) {
556
			return new NotFound(['message' => 'Localization not found.']);
557
		}
558
559
		// hydrate
560
		$serializer = Localization::getSerializer();
561
		$localization = $serializer->hydrate($localization, $data);
562
563
		// validate
564
		$validator = $this->getValidator();
0 ignored issues
show
Bug introduced by
It seems like getValidator() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
565
		if ($validator !== null && !$validator->validate($localization)) {
566
			return new NotValid([
567
				'errors' => $validator->getValidationFailures()
568
			]);
569
		}
570
571
		// dispatch
572
		$event = new LocalizationEvent($localization);
573
		$dispatcher = $this->getServiceContainer()->getDispatcher();
574
		$dispatcher->dispatch(LocalizationEvent::PRE_UPDATE, $event);
575
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
576
		$rows = $localization->save();
577
		$dispatcher->dispatch(LocalizationEvent::POST_UPDATE, $event);
578
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
579
580
		$payload = ['model' => $localization];
581
582
		if ($rows === 0) {
583
			return new NotUpdated($payload);
584
		}
585
586
		return new Updated($payload);
587
	}
588
589
	/**
590
	 * Updates ApplicationUris on Localization
591
	 * 
592
	 * @param mixed $id
593
	 * @param mixed $data
594
	 * @return PayloadInterface
595
	 */
596
	public function updateApplicationUris($id, $data) {
597
		// find
598
		$localization = $this->get($id);
599
600
		if ($localization === null) {
601
			return new NotFound(['message' => 'Localization not found.']);
602
		}
603
604
		// remove all relationships before
605
		ApplicationUriQuery::create()->filterByLocalization($localization)->delete();
606
607
		// add them
608
		$errors = [];
609
		foreach ($data as $entry) {
610
			if (!isset($entry['id'])) {
611
				$errors[] = 'Missing id for ApplicationUri';
612
			}
613
			$applicationUri = ApplicationUriQuery::create()->findOneById($entry['id']);
614
			$localization->addApplicationUri($applicationUri);
615
		}
616
617
		if (count($errors) > 0) {
618
			return new NotValid(['errors' => $errors]);
619
		}
620
621
		// save and dispatch events
622
		$event = new LocalizationEvent($localization);
623
		$dispatcher = $this->getServiceContainer()->getDispatcher();
624
		$dispatcher->dispatch(LocalizationEvent::PRE_APPLICATION_URIS_UPDATE, $event);
625
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
626
		$rows = $localization->save();
627
		$dispatcher->dispatch(LocalizationEvent::POST_APPLICATION_URIS_UPDATE, $event);
628
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
629
630
		if ($rows > 0) {
631
			return Updated(['model' => $localization]);
632
		}
633
634
		return NotUpdated(['model' => $localization]);
635
	}
636
637
	/**
638
	 * Updates LanguageVariants on Localization
639
	 * 
640
	 * @param mixed $id
641
	 * @param mixed $data
642
	 * @return PayloadInterface
643
	 */
644
	public function updateLanguageVariants($id, $data) {
645
		// find
646
		$localization = $this->get($id);
647
648
		if ($localization === null) {
649
			return new NotFound(['message' => 'Localization not found.']);
650
		}
651
652
		// remove all relationships before
653
		LocalizationVariantQuery::create()->filterByLocalization($localization)->delete();
654
655
		// add them
656
		$errors = [];
657
		foreach ($data as $entry) {
658
			if (!isset($entry['id'])) {
659
				$errors[] = 'Missing id for LanguageVariant';
660
			}
661
			$languageVariant = LanguageVariantQuery::create()->findOneById($entry['id']);
662
			$localization->addLanguageVariant($languageVariant);
663
		}
664
665
		if (count($errors) > 0) {
666
			return new NotValid(['errors' => $errors]);
667
		}
668
669
		// save and dispatch events
670
		$event = new LocalizationEvent($localization);
671
		$dispatcher = $this->getServiceContainer()->getDispatcher();
672
		$dispatcher->dispatch(LocalizationEvent::PRE_LANGUAGE_VARIANTS_UPDATE, $event);
673
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
674
		$rows = $localization->save();
675
		$dispatcher->dispatch(LocalizationEvent::POST_LANGUAGE_VARIANTS_UPDATE, $event);
676
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
677
678
		if ($rows > 0) {
679
			return Updated(['model' => $localization]);
680
		}
681
682
		return NotUpdated(['model' => $localization]);
683
	}
684
685
	/**
686
	 * Updates Localizations on Localization
687
	 * 
688
	 * @param mixed $id
689
	 * @param mixed $data
690
	 * @return PayloadInterface
691
	 */
692
	public function updateLocalizations($id, $data) {
693
		// find
694
		$localization = $this->get($id);
695
696
		if ($localization === null) {
697
			return new NotFound(['message' => 'Localization not found.']);
698
		}
699
700
		// remove all relationships before
701
		LocalizationQuery::create()->filterByParent($localization)->delete();
702
703
		// add them
704
		$errors = [];
705
		foreach ($data as $entry) {
706
			if (!isset($entry['id'])) {
707
				$errors[] = 'Missing id for Localization';
708
			}
709
			$localization = LocalizationQuery::create()->findOneById($entry['id']);
710
			$localization->addLocalization($localization);
711
		}
712
713
		if (count($errors) > 0) {
714
			return new NotValid(['errors' => $errors]);
715
		}
716
717
		// save and dispatch events
718
		$event = new LocalizationEvent($localization);
719
		$dispatcher = $this->getServiceContainer()->getDispatcher();
720
		$dispatcher->dispatch(LocalizationEvent::PRE_LOCALIZATIONS_UPDATE, $event);
721
		$dispatcher->dispatch(LocalizationEvent::PRE_SAVE, $event);
722
		$rows = $localization->save();
723
		$dispatcher->dispatch(LocalizationEvent::POST_LOCALIZATIONS_UPDATE, $event);
724
		$dispatcher->dispatch(LocalizationEvent::POST_SAVE, $event);
725
726
		if ($rows > 0) {
727
			return Updated(['model' => $localization]);
728
		}
729
730
		return NotUpdated(['model' => $localization]);
731
	}
732
733
	/**
734
	 * Implement this functionality at keeko\core\domain\LocalizationDomain
735
	 * 
736
	 * @param LocalizationQuery $query
737
	 * @param mixed $filter
738
	 * @return void
739
	 */
740
	abstract protected function applyFilter(LocalizationQuery $query, $filter);
741
742
	/**
743
	 * Returns one Localization with the given id from cache
744
	 * 
745
	 * @param mixed $id
746
	 * @return Localization|null
747
	 */
748
	protected function get($id) {
749
		if ($this->pool === null) {
750
			$this->pool = new Map();
751
		} else if ($this->pool->has($id)) {
752
			return $this->pool->get($id);
753
		}
754
755
		$localization = LocalizationQuery::create()->findOneById($id);
756
		$this->pool->set($id, $localization);
757
758
		return $localization;
759
	}
760
761
	/**
762
	 * Returns the service container
763
	 * 
764
	 * @return ServiceContainer
765
	 */
766
	abstract protected function getServiceContainer();
767
}
768