/** * renews all references, for example after unserializing an ElementInterface * @param Document|Asset|Object\AbstractObject $data * @return mixed */ public static function renewReferences($data, $initial = true) { if (is_array($data)) { foreach ($data as &$value) { $value = self::renewReferences($value, false); } return $data; } else { if (is_object($data)) { if ($data instanceof ElementInterface && !$initial) { return self::getElementById(self::getElementType($data), $data->getId()); } else { // if this is the initial element set the correct path and key if ($data instanceof ElementInterface && $initial) { $originalElement = self::getElementById(self::getElementType($data), $data->getId()); if ($originalElement) { if ($data instanceof Asset) { $data->setFilename($originalElement->getFilename()); } else { if ($data instanceof Document) { $data->setKey($originalElement->getKey()); } else { if ($data instanceof Object\AbstractObject) { $data->setKey($originalElement->getKey()); } } } if (!Object\AbstractObject::doNotRestoreKeyAndPath()) { $data->setPath($originalElement->getPath()); } } } $properties = get_object_vars($data); foreach ($properties as $name => $value) { $data->{$name} = self::renewReferences($value, false); } return $data; } } } return $data; }