19
19
use eZ \Publish \SPI \Persistence \Content \Type \FieldDefinition ;
20
20
use eZ \Publish \SPI \Persistence \Content \VersionInfo ;
21
21
use Ibexa \Contracts \Core \Event \Mapper \ResolveMissingFieldEvent ;
22
+ use Ibexa \Contracts \FieldType \DefaultDataFieldStorage ;
22
23
use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
23
24
24
25
final class ResolveVirtualFieldSubscriber implements EventSubscriberInterface
@@ -47,6 +48,7 @@ public static function getSubscribedEvents(): array
47
48
return [
48
49
ResolveMissingFieldEvent::class => [
49
50
['persistExternalStorageField ' , -100 ],
51
+ ['resolveVirtualExternalStorageField ' , -80 ],
50
52
['resolveVirtualField ' , 0 ],
51
53
],
52
54
];
@@ -73,6 +75,9 @@ public function resolveVirtualField(ResolveMissingFieldEvent $event): void
73
75
}
74
76
}
75
77
78
+ /**
79
+ * @throws \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Exception\NotFound
80
+ */
76
81
public function persistExternalStorageField (ResolveMissingFieldEvent $ event ): void
77
82
{
78
83
$ field = $ event ->getField ();
@@ -98,13 +103,61 @@ public function persistExternalStorageField(ResolveMissingFieldEvent $event): vo
98
103
$ this ->getDefaultStorageValue ()
99
104
);
100
105
101
- $ storage ->getFieldData (
106
+ $ result = $ storage ->storeFieldData (
102
107
$ content ->versionInfo ,
103
108
$ field ,
104
109
$ event ->getContext ()
105
110
);
106
111
112
+ if ($ result === true ) {
113
+ $ storageValue = new StorageFieldValue ();
114
+ $ converter = $ this ->converterRegistry ->getConverter ($ fieldDefinition ->fieldType );
115
+ $ converter ->toStorageValue (
116
+ $ field ->value ,
117
+ $ storageValue
118
+ );
119
+
120
+ $ this ->contentGateway ->updateField (
121
+ $ field ,
122
+ $ storageValue
123
+ );
124
+ }
125
+
126
+ $ event ->setField ($ field );
127
+ }
128
+
129
+ public function resolveVirtualExternalStorageField (ResolveMissingFieldEvent $ event ): void
130
+ {
131
+ $ field = $ event ->getField ();
132
+
133
+ if ($ field && $ field ->id !== null ) {
134
+ // Not a virtual field
135
+ return ;
136
+ }
137
+
138
+ $ fieldDefinition = $ event ->getFieldDefinition ();
139
+ $ storage = $ this ->storageRegistry ->getStorage ($ fieldDefinition ->fieldType );
140
+
141
+ if ($ storage instanceof NullStorage) {
142
+ // Not an external storage
143
+ return ;
144
+ }
145
+
146
+ if (!$ storage instanceof DefaultDataFieldStorage) {
147
+ return ;
148
+ }
149
+
150
+ $ content = $ event ->getContent ();
151
+
152
+ $ storage ->getDefaultFieldData (
153
+ $ content ->versionInfo ,
154
+ $ field
155
+ );
156
+
107
157
$ event ->setField ($ field );
158
+
159
+ // Do not persist the external storage field
160
+ $ event ->stopPropagation ();
108
161
}
109
162
110
163
/**
0 commit comments