archive = new VBOBackupExportArchive($path); } /** * Sets the version of the manifest. * * @param string $version * * @return self This object to support chaining. */ public function setVersion($version, $platform = null) { if (is_null($platform)) { // register generic version $this->version = $version; } else { // register platform version $this->platforms[$platform] = $version; } return $this; } /** * Creates a new export rule. * * @param string $rule The identifier of the rule to create. * @param mixed $data The instructions used for the rule setup. * * @return self This object to support chaining. * * @throws Exception */ public function createRule($rule, $data) { // build class name $classname = preg_replace("/_/", ' ', $rule); $classname = preg_replace("/\s+/", '', ucwords($classname)); $classname = 'VBOBackupExportRule' . $classname; // make sure the rule class exists if (!class_exists($classname)) { // class not found throw new Exception(sprintf('Cannot find [%s] export rule class', $classname), 404); } // attach the rule return $this->attachRule(new $classname($this->archive, $data)); } /** * Attaches the specified rule as export instruction. * * @param VBOBackupExportRule $rule The rule to attach. * * @return self This object to support chaining. */ public function attachRule(VBOBackupExportRule $rule) { // register rule only if there is some data to export if ($rule->getData()) { $this->rules[] = $rule; } return $this; } /** * Returns an array of registered installer rules. * * @return VBOBackupExportRule[] */ public function getRules() { return $this->rules; } /** * Compresses the archive. * * @return string The archive path. */ public function compress() { // create manifest $manifest = $this->createManifest(); if (defined('JSON_PRETTY_PRINT')) { $flag = JSON_PRETTY_PRINT; } else { $flag = 0; } // try to encode the manifest in JSON format $json = json_encode($manifest, $flag); if ($json === false) { // an error has occurred while trying to encode the manifest file in JSON format throw new UnexpectedValueException('Failed to encode the manifest file. Error: ' . json_last_error() . '.', 500); } // add manifest file into the root of the archive $this->archive->addBuffer($json, 'manifest.json'); // complete the backup process by creating the archive return $this->archive->compress(); } /** * Creates the backup manifest. * * @return object The backup manifest to be encoded in JSON format. */ protected function createManifest() { // before to compress the archive, we need to create the installation manifest $manifest = new stdClass; $manifest->title = basename($this->archive->getPath()); $manifest->version = $this->version ?: VIKBOOKING_SOFTWARE_VERSION; $manifest->application = 'Vik Booking'; $manifest->signature = md5($manifest->application . ' ' . $manifest->version); $manifest->langtag = '*'; $manifest->dateCreated = JFactory::getDate()->toSql(); $manifest->installers = $this->getRules(); if ($this->platforms) { $manifest->platforms = new stdClass; foreach ($this->platforms as $id => $version) { $manifest->platforms->{$id} = new stdClass; $manifest->platforms->{$id}->version = $version; $manifest->platforms->{$id}->signature = md5($manifest->application . ' ' . $id . ' ' . $version); } } $app = JFactory::getApplication(); /** * Trigger event to allow third party plugins to manipulate the backup manifest. * Fires just before performing the compression of the archive. * * @param object $manifest The backup manifest. * @param VBOBackupExportArchive $archive The instance used to manage the archive. * * @return void * * @since 1.5 */ $app->triggerEvent('onCreateBackupManifestVikBooking', [$manifest, $this->archive]); return $manifest; } }