ldc-wenn-dann-mit-respekt/app/Traits/Models/IsPublishable.php

140 lines
3.2 KiB
PHP

<?php
namespace App\Traits\Models;
use Carbon\Carbon;
/**
*
*/
trait IsPublishable
{
/**
* Initialize the Trait (Laravel magic method)
*
* @return void
*/
public function initializeIsPublishable(): void
{
/** @var \Illuminate\Database\Eloquent\Model $this */
$this->mergeCasts([
'status' => 'string',
'publish_at' => 'datetime',
'unpublish_at' => 'datetime',
]);
$this->mergeFillable([
'status',
'publish_at',
'unpublish_at',
]);
}
/**
* Adjusts model status using current status and publish dates
*
* @return void
*/
public function makeStatusSense(): void
{
/** @var \Carbon\Carbon|null */
$publish_at = $this->publish_at;
/** @var \Carbon\Carbon|null */
$unpublish_at = $this->unpublish_at;
$wantedStatus = $this->status;
if ($publish_at or $unpublish_at) {
$this->status = $this->planificated_status;
}
if ($wantedStatus !== $this->status) {
$previousMessage = session()->get('bo.info', '');
session()->flash('bo.info', \trans(
'La publication est modifiée en concordance avec les dates enregistrées donc
pour modifier l\'état de publication, veuillez modifier ou enlever les dates correspondantes.'
) . " \n{$previousMessage}");
}
}
/**
* Getter the current status following planification dates planificated_status
*
* @return boolean
*/
public function getPlanificatedStatusAttribute(): bool
{
/** @var \Carbon\Carbon */
$publish_at = $this->publish_at;
/** @var \Carbon\Carbon|null */
$unpublish_at = $this->unpublish_at;
if ($unpublish_at) {
return $publish_at->lessThan(now()) && $unpublish_at->greaterThanOrEqualTo(now());
}
return $publish_at->lessThan(now());
}
// * GETTERS / SETTERS (for PHPStan)
/**
* Get status attribute.
*
* @return boolean
*/
public function getStatus(): bool
{
return $this->status;
}
/**
* Set status attribute.
*
* @param boolean $status
* @return void
*/
public function setStatus(bool $status): void
{
$this->status = $status;
}
/**
* Get publish_at attribute.
*
* @return \Carbon\Carbon|null
*/
public function getPublishAt(): Carbon|null
{
return $this->publish_at;
}
/**
* Set publish_at attribute.
*
* @param \Carbon\Carbon|null $date
* @return void
*/
public function setPublishAt(Carbon|null $date): void
{
$this->publish_at = $date;
}
/**
* Get unpublish_at attribute.
*
* @return \Carbon\Carbon|null
*/
public function getUnpublishAt(): Carbon|null
{
return $this->unpublish_at;
}
/**
* Set unpublish_at attribute.
*
* @param \Carbon\Carbon|null $date
* @return void
*/
public function setUnpublishAt(Carbon|null $date): void
{
$this->unpublish_at = $date;
}
}