diff --git a/includes/class-QuerySharable.php b/includes/class-QuerySharable.php index 4ccf235..16ebb62 100644 --- a/includes/class-QuerySharable.php +++ b/includes/class-QuerySharable.php @@ -1,124 +1,140 @@ . // require dependent traits class_exists( QueryEvent::class, true ); /** * Methods related to a QuerySharable class */ trait QuerySharableTrait { /** * Where the Sharable is... * * @param object $event Sharable * @return self */ public function whereSharable( $event ) { return $this->whereSharableID( $event->getSharableID() ); } /** * Where the Sharable ID is... * * @param int $id Sharable ID * @return self */ public function whereSharableID( $id ) { return $this->whereInt( $this->SHARABLE_ID, $id ); } /** * Where the Sharable has a parent * * @param boolean $has Set to false to have not a parent * @return self */ public function whereSharableHasParent( $has = true ) { // it has the parent if it's not NULL $verb = $has ? 'IS NOT' : 'IS'; return $this->compare( Sharable::PARENT, $verb, 'NULL' ); } /** * Where the Sharable has not a parent * * @param boolean $has Set to false to have not a parent * @return self */ public function whereSharableIsRoot() { return $this->whereSharableHasParent( false ); } /** * Where the Sharable has a parent and it's this one * * @param Sharable $sharable * @return self */ public function whereSharableParent( $sharable ) { - return $this->whereSharableParentID( $sharable->getSharableParentID() ); + return $this->whereSharableParentID( $sharable->getSharableID() ); } /** * Where the Sharable has a parent and it's this one * * @param int $id Sharable ID * @return self */ public function whereSharableParentID( $id ) { return $this->whereInt( Sharable::PARENT, $id ); } + /** + * Select a field called 'has_sharable_children' + * + * @return self + */ + public function selectSharableHasChildren( $alias = 'sharable_has_children' ) { + + // check if it exists another Sharable with this row as its parent + $temp_subquery_alias = 'sharable_children'; + $subquery = ( new QuerySharable( null, $temp_subquery_alias ) ) + ->equals( $temp_subquery_alias . DOT . Sharable::PARENT, Sharable::ID_ ) + ->getQuery(); + + return $this->select( "EXISTS( $subquery ) $alias"); + } + } /** * Utility used to Query a Sharable. */ class QuerySharable extends Query { use QuerySharableTrait; use QueryEventTrait; /** * Univoque Event ID column name * * @var */ protected $EVENT_ID = 'sharable.event_ID'; /** * Constructor * * @param DB $db Database or NULL for the default one * @param string $alias Table alias */ - public function __construct() { + public function __construct( $db = null, $alias = true ) { // initialize Query parent::__construct(); // select default table - $this->from( Sharable::T ); + $this->fromAlias( Sharable::T, $alias ); // select default result class name $this->defaultClass( Sharable::class ); } } diff --git a/includes/class-Sharable.php b/includes/class-Sharable.php index 87d1bfa..662f43d 100644 --- a/includes/class-Sharable.php +++ b/includes/class-Sharable.php @@ -1,268 +1,285 @@ . 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() { + public function hasSharableParent() { return $this->has( Sharable::PARENT ); } /** * Get the ID of the parent Sharable (if any) * * See https://gitpull.it/T557 * * @return mixed */ - public function getParentSharableID() { + public function getSharableParentID() { 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(); } /** * @TODO: $base = ROOT is wrong and should be $absolute = false */ 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 = 'sharable_parent'; /** * 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 ( new QuerySharable ) ->whereEventID( $event_ID ); } + + /** + * All basic fields + * + * @return array + */ + public static function fields() { + return [ + self::ID_, + self::TITLE, + self::TYPE, + self::PATH, + self::MIME, + self::LICENSE, + self::PARENT, + ]; + } }