5 use Drupal\Core\TypedData\DataDefinition;
6 use Drupal\Core\TypedData\ListDataDefinition;
7 use Drupal\Core\TypedData\Plugin\DataType\ItemList;
8 use Drupal\Core\TypedData\TypedData;
24 $schemaRetriever = \Drupal::service(
"dkan_schema.schema_retriever");
25 $json = $schemaRetriever->retrieve(
"dataset");
26 $object = json_decode($json);
27 $properties = array_keys((array) $object->properties);
29 foreach ($properties as $property) {
30 $type = $object->properties->{$property}->type;
31 $defs = self::getPropertyDefinition($type, $object, $property);
32 $definitions = array_merge($definitions, $defs);
41 private static function getPropertyDefinition($type, $object, $property_name) {
43 if (($type ==
"array" && isset($object->properties->{$property_name}->items->properties))
44 || $type ==
"object") {
45 $defs = self::getComplexPropertyDefinition($object->properties->{$property_name}, $type, $property_name);
48 $defs[$property_name] = self::getDefinitionObject($type);
56 private static function getComplexPropertyDefinition($property_items, $type, $property_name) {
59 $child_properties = [];
60 if ($type ==
"array" && isset($property_items->items->properties)) {
61 $prefix = $property_name .
'__item__';
62 $props = $property_items->items->properties;
63 $child_properties = array_keys((array) $props);
65 elseif ($type ==
"object" && isset($property_items->properties)) {
66 $prefix = $property_name .
'__';
67 $props = $property_items->properties;
68 $child_properties = array_keys((array) $props);
71 $definitions[$property_name] = self::getDefinitionObject($type);
74 foreach ($child_properties as $child) {
75 $definitions[$prefix . $child] = self::getDefinitionObject($type);
83 private static function getDefinitionObject($type) {
84 if ($type ==
"object" || $type ==
"any") {
88 if ($type ==
"array") {
89 return ListDataDefinition::create(
"string");
91 return DataDefinition::createFromDataType($type);
98 $this->data = json_decode($json);
106 public function get($property_name) {
107 $definitions = self::definition();
109 if (!isset($definitions[$property_name])) {
113 $definition = $definitions[$property_name];
115 if ($definition instanceof ListDataDefinition) {
116 $property =
new ItemList($definition, $property_name);
117 $values = $this->getArrayValues($property_name);
118 $property->setValue($values);
121 $property =
new class ($definition, $property_name) extends TypedData{};
122 $value = $this->getPropertyValue($property_name);
123 $property->setValue($value);
132 private function getPropertyValue($property_name) {
136 if (preg_match(
'/(.*)__(.*)/', $property_name, $matches)) {
138 if (isset($matches[1])
139 && isset($this->data->{$matches[1]})
140 && isset($matches[2])
141 && isset($this->data->{$matches[1]}->{$matches[2]})) {
142 $value = $this->data->{$matches[1]}->{$matches[2]};
145 elseif (isset($this->data->{$property_name})) {
146 $value = $this->data->{$property_name};
155 private function getArrayValues($property_name) {
158 if (preg_match(
'/(.*)__item__(.*)/', $property_name, $matches)) {
159 foreach ($this->data->{$matches[1]} as $dist) {
160 $values[] = isset($dist->{$matches[2]}) ? $dist->{$matches[2]} : [];
163 elseif (isset($this->data->{$property_name})) {
164 $values = $this->data->{$property_name};
165 $values = is_string($values) ? json_decode($values) : $values;
177 $definitions = self::definition();
179 foreach (array_keys($definitions) as $propertyName) {
180 $properties[$propertyName] = $this->
get($propertyName);