132 lines
3.3 KiB
PHP
Executable File
132 lines
3.3 KiB
PHP
Executable File
<?php
|
|
if ( !class_exists('Puc_v4p1_Metadata', false) ):
|
|
|
|
/**
|
|
* A base container for holding information about updates and plugin metadata.
|
|
*
|
|
* @author Janis Elsts
|
|
* @copyright 2016
|
|
* @access public
|
|
*/
|
|
abstract class Puc_v4p1_Metadata {
|
|
|
|
/**
|
|
* Create an instance of this class from a JSON document.
|
|
*
|
|
* @abstract
|
|
* @param string $json
|
|
* @return self
|
|
*/
|
|
public static function fromJson(/** @noinspection PhpUnusedParameterInspection */ $json) {
|
|
throw new LogicException('The ' . __METHOD__ . ' method must be implemented by subclasses');
|
|
}
|
|
|
|
/**
|
|
* @param string $json
|
|
* @param self $target
|
|
* @return bool
|
|
*/
|
|
protected static function createFromJson($json, $target) {
|
|
/** @var StdClass $apiResponse */
|
|
$apiResponse = json_decode($json);
|
|
if ( empty($apiResponse) || !is_object($apiResponse) ){
|
|
trigger_error(
|
|
"Failed to parse update metadata. Try validating your .json file with http://jsonlint.com/",
|
|
E_USER_NOTICE
|
|
);
|
|
return false;
|
|
}
|
|
|
|
$valid = $target->validateMetadata($apiResponse);
|
|
if ( is_wp_error($valid) ){
|
|
trigger_error($valid->get_error_message(), E_USER_NOTICE);
|
|
return false;
|
|
}
|
|
|
|
foreach(get_object_vars($apiResponse) as $key => $value){
|
|
$target->$key = $value;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* No validation by default! Subclasses should check that the required fields are present.
|
|
*
|
|
* @param StdClass $apiResponse
|
|
* @return bool|WP_Error
|
|
*/
|
|
protected function validateMetadata(/** @noinspection PhpUnusedParameterInspection */ $apiResponse) {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Create a new instance by copying the necessary fields from another object.
|
|
*
|
|
* @abstract
|
|
* @param StdClass|self $object The source object.
|
|
* @return self The new copy.
|
|
*/
|
|
public static function fromObject(/** @noinspection PhpUnusedParameterInspection */ $object) {
|
|
throw new LogicException('The ' . __METHOD__ . ' method must be implemented by subclasses');
|
|
}
|
|
|
|
/**
|
|
* Create an instance of StdClass that can later be converted back to an
|
|
* update or info container. Useful for serialization and caching, as it
|
|
* avoids the "incomplete object" problem if the cached value is loaded
|
|
* before this class.
|
|
*
|
|
* @return StdClass
|
|
*/
|
|
public function toStdClass() {
|
|
$object = new stdClass();
|
|
$this->copyFields($this, $object);
|
|
return $object;
|
|
}
|
|
|
|
/**
|
|
* Transform the metadata into the format used by WordPress core.
|
|
*
|
|
* @return object
|
|
*/
|
|
abstract public function toWpFormat();
|
|
|
|
/**
|
|
* Copy known fields from one object to another.
|
|
*
|
|
* @param StdClass|self $from
|
|
* @param StdClass|self $to
|
|
*/
|
|
protected function copyFields($from, $to) {
|
|
$fields = $this->getFieldNames();
|
|
|
|
if ( property_exists($from, 'slug') && !empty($from->slug) ) {
|
|
//Let plugins add extra fields without having to create subclasses.
|
|
$fields = apply_filters($this->getPrefixedFilter('retain_fields') . '-' . $from->slug, $fields);
|
|
}
|
|
|
|
foreach ($fields as $field) {
|
|
if ( property_exists($from, $field) ) {
|
|
$to->$field = $from->$field;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return string[]
|
|
*/
|
|
protected function getFieldNames() {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* @param string $tag
|
|
* @return string
|
|
*/
|
|
protected function getPrefixedFilter($tag) {
|
|
return 'puc_' . $tag;
|
|
}
|
|
}
|
|
|
|
endif; |