2018-09-25 07:30:50 -04:00
< ? php namespace BookStack\Entities ;
use BookStack\Uploads\Image ;
2015-07-12 15:01:42 -04:00
2015-08-16 09:51:45 -04:00
class Book extends Entity
2015-07-12 15:01:42 -04:00
{
2018-03-24 14:46:31 -04:00
public $searchFactor = 2 ;
2015-07-12 15:01:42 -04:00
2017-09-04 10:57:52 -04:00
protected $fillable = [ 'name' , 'description' , 'image_id' ];
2015-07-12 15:01:42 -04:00
2018-09-25 07:30:50 -04:00
/**
* Get the morph class for this model .
* @ return string
*/
public function getMorphClass ()
{
return 'BookStack\\Book' ;
}
2016-05-01 16:20:50 -04:00
/**
* Get the url for this book .
2016-08-14 07:29:35 -04:00
* @ param string | bool $path
2016-05-01 16:20:50 -04:00
* @ return string
*/
2016-08-14 07:29:35 -04:00
public function getUrl ( $path = false )
2015-07-12 15:01:42 -04:00
{
2016-08-14 07:29:35 -04:00
if ( $path !== false ) {
2016-11-12 12:16:52 -05:00
return baseUrl ( '/books/' . urlencode ( $this -> slug ) . '/' . trim ( $path , '/' ));
2016-08-14 07:29:35 -04:00
}
2016-11-12 12:16:52 -05:00
return baseUrl ( '/books/' . urlencode ( $this -> slug ));
2015-07-12 15:01:42 -04:00
}
2017-12-06 12:32:29 -05:00
2017-09-04 10:57:52 -04:00
/**
* Returns book cover image , if book cover not exists return default cover image .
2017-12-06 11:34:26 -05:00
* @ param int $width - Width of the image
2017-12-06 12:32:29 -05:00
* @ param int $height - Height of the image
2017-12-06 11:34:26 -05:00
* @ return string
2017-09-04 10:57:52 -04:00
*/
2017-12-06 12:32:29 -05:00
public function getBookCover ( $width = 440 , $height = 250 )
2017-07-07 06:59:38 -04:00
{
2019-02-16 12:13:01 -05:00
$default = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' ;
2018-01-28 11:58:52 -05:00
if ( ! $this -> image_id ) {
return $default ;
}
2017-12-06 11:34:26 -05:00
2017-07-07 06:59:38 -04:00
try {
2017-09-04 10:57:52 -04:00
$cover = $this -> cover ? baseUrl ( $this -> cover -> getThumb ( $width , $height , false )) : $default ;
2017-07-07 06:59:38 -04:00
} catch ( \Exception $err ) {
$cover = $default ;
}
return $cover ;
}
2017-12-06 12:32:29 -05:00
2017-09-04 10:57:52 -04:00
/**
* Get the cover image of the book
* @ return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
2017-07-07 07:36:08 -04:00
public function cover ()
2017-07-07 06:59:38 -04:00
{
2017-09-04 10:57:52 -04:00
return $this -> belongsTo ( Image :: class , 'image_id' );
2017-07-07 06:59:38 -04:00
}
2015-07-12 15:01:42 -04:00
2016-05-01 16:20:50 -04:00
/**
* Get all pages within this book .
* @ return \Illuminate\Database\Eloquent\Relations\HasMany
*/
2015-07-12 16:31:15 -04:00
public function pages ()
{
2016-05-01 16:20:50 -04:00
return $this -> hasMany ( Page :: class );
2015-07-12 16:31:15 -04:00
}
2019-02-24 10:57:35 -05:00
/**
* Get the direct child pages of this book .
* @ return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function directPages ()
{
return $this -> pages () -> where ( 'chapter_id' , '=' , '0' );
}
2016-05-01 16:20:50 -04:00
/**
* Get all chapters within this book .
* @ return \Illuminate\Database\Eloquent\Relations\HasMany
*/
2015-07-27 15:17:08 -04:00
public function chapters ()
{
2016-05-01 16:20:50 -04:00
return $this -> hasMany ( Chapter :: class );
2015-07-27 15:17:08 -04:00
}
2018-09-20 10:27:30 -04:00
/**
* Get the shelves this book is contained within .
* @ return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function shelves ()
{
return $this -> belongsToMany ( Bookshelf :: class , 'bookshelves_books' , 'book_id' , 'bookshelf_id' );
}
2016-05-01 16:20:50 -04:00
/**
* Get an excerpt of this book ' s description to the specified length or less .
* @ param int $length
* @ return string
*/
2019-04-06 13:47:27 -04:00
public function getExcerpt ( int $length = 100 )
2015-08-31 15:11:44 -04:00
{
2016-05-01 16:20:50 -04:00
$description = $this -> description ;
2019-05-25 11:14:57 -04:00
return mb_strlen ( $description ) > $length ? mb_substr ( $description , 0 , $length - 3 ) . '...' : $description ;
2015-08-31 15:11:44 -04:00
}
2017-03-19 08:48:44 -04:00
/**
* Return a generalised , common raw query that can be 'unioned' across entities .
* @ return string
*/
public function entityRawQuery ()
{
return " 'BookStack \\ \\ Book' as entity_type, id, id as entity_id, slug, name, { $this -> textField } as text,'' as html, '0' as book_id, '0' as priority, '0' as chapter_id, '0' as draft, created_by, updated_by, updated_at, created_at " ;
}
2015-07-12 15:01:42 -04:00
}