diff --git a/documentation/database/patches/patch-16.sql b/documentation/database/patches/patch-16.sql new file mode 100644 index 0000000..9704a74 --- /dev/null +++ b/documentation/database/patches/patch-16.sql @@ -0,0 +1,3 @@ +ALTER TABLE `{$prefix}sharable` + ADD COLUMN `parent_sharable_ID` INT(10) UNSIGNED AFTER `sharable_license`, + ADD CONSTRAINT `fk_parent_sharable_ID` FOREIGN KEY (`parent_sharable_ID`) REFERENCES `{$prefix}sharable` (`sharable_ID`); diff --git a/includes/class-Sharable.php b/includes/class-Sharable.php index 2d7236f..b5cd3ee 100644 --- a/includes/class-Sharable.php +++ b/includes/class-Sharable.php @@ -1,235 +1,265 @@ . trait SharableTrait { /** * Get the sharable ID * * @return int */ public function getSharableID() { return $this->nonnull( Sharable::ID ); } + /** + * Check if this Sharable has a parent + * + * See https://gitpull.it/T557 + * + * @return boolean + */ + public function hasParentSharable() { + return $this->has( Sharable::PARENT ); + } + + /** + * Get the ID of the parent Sharable (if any) + * + * See https://gitpull.it/T557 + * + * @return mixed + */ + public function getParentSharableID() { + return $this->get( Sharable::PARENT ); + } + /** * Get the localized sharable title * * @param $args array Title arguments like 'prop' * @return string */ public function getSharableTitle( $args = [] ) { $sharable_title = $this->get( Sharable::TITLE ); if( ! isset( $sharable_title ) ) { return $this->getDefaultSharableTitle( $args ); } return __( $sharable_title ); } /** * Retrieve something usable as a title * * @param $args array Title arguments like 'prop' * @return string */ public function getDefaultSharableTitle( $args = [] ) { $sharable_type = $this->get( Sharable::TYPE ); if( $sharable_type === 'youtube' ) { if( isset( $args['prop'] ) && $args['prop'] ) { return sprintf( __("il %s"), __("video esterno") ); } else { return __("video esterno"); } } $sharable_path = $this->get( Sharable::PATH ); // Get filename from "/asd/asd/asd/(filename)" $i = 0; while( strpos( $sharable_path, _, $i ) !== false ) { $i++; } return substr( $sharable_path, $i ); } /** * Is it an image? * * @return bool */ public function isSharableImage() { return $this->isSharableType( 'image' ); } /** * Is it a video? * * @return bool */ public function isSharableVideo() { return $this->isSharableType( 'video' ); } /** * Is it a document? * * @return bool */ public function isSharableDocument() { return $this->isSharableType( 'document' ); } /** * Is it an iframe (like a YouTube video?) * * @return bool */ public function isSharableIframe() { return $this->isSharableType( 'youtube' ); } /** * Is it of a certain type? * * @param $type string * @return bool */ private function isSharableType( $type ) { return $this->get( Sharable::TYPE ) === $type; } /** * It can be downloaded? * * @return bool */ public function isSharableDownloadable() { return ! $this->isSharableIframe(); } function getSharablePath( $base = ROOT ) { $type = $this->get( Sharable::TYPE ); $path = $this->get( Sharable::PATH ); if( 'youtube' === $type ) { return "https://www.youtube.com/watch?v={$path}"; } return site_page( $path, $base ); } /** * Get the MIME type * * @return string|null */ public function getSharableMIME() { return $this->get( Sharable::MIME ); } /** * Get the license * * @return License */ public function getSharableLicense() { return license( $this->get( Sharable::LICENSE ) ); } /** * Normalize a Sharable object */ protected function normalizeSharable() { $this->integers( Sharable::ID, + Sharable::PARENT, Event ::ID ); } } /** * A Sharable is an attachment related to a Talk */ class Sharable extends Queried { use SharableTrait; /** * Database table name */ const T = 'sharable'; /** * Sharable ID column */ const ID = 'sharable_ID'; /** * Sharable title column */ const TITLE = 'sharable_title'; /** * Sharable type column */ const TYPE = 'sharable_type'; /** * Sharable path column */ const PATH = 'sharable_path'; /** * Sharable mime type column */ const MIME = 'sharable_mimetype'; /** * Sharable license column */ const LICENSE = 'sharable_license'; + /** + * Name of the parent sharable_ID column + * + * See https://gitpull.it/T557 + */ + const PARENT = 'parent_sharable_ID'; + /** * Sharable univoque ID */ const ID_ = self::T . DOT . self::ID; /** * Sharable event ID */ const EVENT_ = self::T . DOT . Event::ID; /** * Constructor */ public function __construct() { $this->normalizeSharable(); } /** * Factory by an event * * @param $event_ID int Event ID * @return Query */ public static function factoryByEvent( $event_ID ) { return self::factory() ->whereInt( Sharable::EVENT_, $event_ID ); } }