-
Notifications
You must be signed in to change notification settings - Fork 453
/
EntryBuilder.php
95 lines (81 loc) · 2.55 KB
/
EntryBuilder.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
<?php
namespace Concrete\Core\Express;
use Concrete\Core\Entity\Express\Association;
use Concrete\Core\Entity\Express\Entity;
use Concrete\Core\Express\Association\Applier;
use Concrete\Core\Express\Entry\Manager as EntryManager;
use Concrete\Core\Express\EntryBuilder\AssociationUpdater;
use Concrete\Core\Express\ObjectBuilder\AssociationBuilder;
use Doctrine\ORM\EntityManagerInterface;
class EntryBuilder
{
protected $entryManager;
protected $entity;
protected $attributes = [];
protected $associations = [];
public function __construct(
EntryManager $entryManager
)
{
$this->entryManager = $entryManager;
}
public function createEntry(Entity $entity)
{
$this->entity = $entity;
return $this;
}
public function setAttribute($key, $value)
{
$this->attributes[$key] = $value;
return $this;
}
public function __call($nm, $a)
{
if (substr($nm, 0, 3) == 'set') {
$nm = preg_replace('/(?!^)[[:upper:]]/', '_\0', $nm);
$nm = strtolower($nm);
$identifier = str_replace('set_', '', $nm);
$association = $this->getEntity()->getAssociation($identifier);
if ($association instanceof Association) {
$this->associations[] = [$identifier, $a[0]];
} else {
$this->attributes[$identifier] = $a[0];
}
} else {
trigger_error('Call to undefined method '.__CLASS__.'::'.$nm.'()', E_USER_ERROR);
}
return $this;
}
public function save()
{
$entry = $this->entryManager->addEntry($this->getEntity());
foreach($this->attributes as $key => $value) {
$entry->setAttribute($key, $value);
}
$em = $this->entryManager->getEntityManager();
$em->refresh($entry); // gotta repopulate that $attributes array on the Entry object.
if (count($this->associations)) {
foreach($this->associations as $row) {
$associationHandle = $row[0];
$subject = $row[1];
$updater = new AssociationUpdater(new Applier($this->entryManager->getEntityManager()), $entry);
$updater->associate($associationHandle, $subject);
}
}
return $entry;
}
/**
* @return EntityManagerInterface
*/
public function getEntityManager()
{
return $this->entityManager;
}
/**
* @return Entity
*/
public function getEntity()
{
return $this->entity;
}
}