initialState = $this->getCurrentState(); } public function isSuccess(): bool { return $this->success ?? false; } public function setSuccess(bool $success): void { $this->success = $success; } public function getMessage(): string { return $this->message ?? ''; } public function setMessage(string $message): void { $this->message = $message; } /** * @return array */ public function getAdditionalData(): array { return $this->additionalData ?? []; } /** * @param array $additionalData */ public function setAdditionalData(array $additionalData): void { $this->additionalData = $additionalData; } public function hasResponseBeenModified(): bool { return $this->initialState !== $this->getCurrentState(); } /** * Checks which property values have changed from the initial state and only includes them in the JSON string. * * @return string JSON of the response object * @throws \Exception If none of the properties have been set */ public function getJsonResponse(): string { return json_encode($this->getResponseArray()); } /** * Checks which property values have changed from the initial state and only includes them in the array. * * @return array response object properties * @throws \Exception If none of the properties have been set */ public function getResponseArray(): array { $responseArray = []; $currentState = $this->getCurrentState(); foreach ($this->initialState as $propertyName => $value) { if ($currentState[$propertyName] !== $value) { $responseArray[$propertyName] = $currentState[$propertyName]; } } if (count($responseArray) === 0) { throw new \Exception('No duplicate request response properties were set.'); } // If the flag is set to post the event and the request was successful, post the event for the duplication if ($this->success && $this->eventDataToPost !== null) { Piwik::postEvent('EntityDuplicator.DuplicationSuccessful', $this->eventDataToPost); } return $responseArray; } /** * @return array */ private function getCurrentState(): array { // Get an array of all the property values $state = get_object_vars($this); // Exclude the state property and eventDataToPost unset($state['initialState']); unset($state['eventDataToPost']); return $state; } /** * Set the arguments to be used while posting the event when the response array is built. This is used by plugins * which use this class while generating the response to a duplication request. * * @param string $entityTypeTranslation Translation key for the name of the type of entity. E.g. Goals_Goal, * Heatmaps_Heatmap, etc. * @param string $entityName The name of the entity being copied. E.g. 'Goal that does thing' or'Home page heatmap'. * @param int|null $idEntity The ID of the entity being copied. E.g. 2 or 900. It's optional since some entities * might only have a string identifier which should be provided as the entityName. * @param int|null $idSite ID of the source site. It's optional in case the entity being copied is not site scoped, * like a system-wide configuration. * @param array|null $idDestinationSites IDs of the destination sites. This is optional for the same reason as * idSite but also since it doesn't need to be provided if the only destination site is the source site (idSite). * @param array|null $additionalData Optional array of additional data relating to the entity being copied. */ public function setRequestDataForEvent( string $entityTypeTranslation, string $entityName, ?int $idEntity = null, ?int $idSite = null, ?array $idDestinationSites = null, ?array $additionalData = null ): void { $this->eventDataToPost = [ $entityTypeTranslation, $entityName, $idEntity, $idSite, $idDestinationSites, $additionalData, ]; } }