ldc-legaulois/app/Models/Engagement.php
2022-02-10 16:14:58 +01:00

375 lines
13 KiB
PHP

<?php
namespace App\Models;
use App\Enums\EngagementBlocType;
use App\Enums\EngagementType;
use App\Enums\InputType;
use App\Lib\Utils;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
use Kwaadpepper\Enum\Traits\CastsEnums;
use SplFileInfo;
class Engagement extends Model
{
use CastsEnums;
protected $enumCasts = [
'type' => EngagementType::class
];
protected $casts = [
'content' => 'array',
];
protected $fillable = [
'icon', 'pretitle', 'title',
'metaTitle', 'metaDescription',
'content', 'status'
];
protected $attributes = [
'icon' => '',
'pretitle' => '',
'metaTitle' => '',
'metaDescription' => '',
'type' => 1,
// EngagementType article
];
protected static function booted()
{
static::creating(function (Engagement $engagement) {
});
static::updating(function (Engagement $engagement) {
});
}
public function setContentAttribute($value)
{
$this->setContent($value);
}
public function getContentAttribute()
{
$content = json_decode($this->getRawOriginal('content'), true);
return isset($content->header) ? $content->header : $content;
}
/**
* Fill the model with an array of attributes.
*
* @param array $attributes
* @return $this
*
* @throws \Illuminate\Database\Eloquent\MassAssignmentException
*/
public function fill(array $attributes)
{
parent::fill($attributes);
if (isset($attributes['content'])) {
$this->setContent($attributes['content']);
}
}
/**
* Get Blocks Template Data
*
* @return array
*/
public static function getBlocks(): array
{
return [
EngagementBlocType::bloc1()->value => [
'type' => EngagementBlocType::bloc1(),
'content' => [
'img' => [
'dimensions' => 'largeur 792,hauteur 555',
'label' => 'Illustration',
'inputType' => InputType::image(),
'alt' => '',
'value' => ''
],
'title' => [
'label' => 'Titre (h2)',
'inputType' => InputType::string(),
'value' => ''
],
'content' => [
'label' => 'Contenu',
'inputType' => InputType::text(),
'value' => ''
],
'side' => [
'label' => 'Orientation de l\'image (gauche ou droite)',
'inputType' => InputType::boolean(),
'value' => ''
],
'link' => [
'text' => 'En savoir +',
'label' => 'Lien du bouton en savoir +',
'inputType' => InputType::url(),
'status' => true,
'newtab' => false,
'value' => ''
],
'labels' => [
'label' => 'Labels avec titre',
'inputType' => InputType::labelArray(),
'value' => []
],
'img2' => [
'dimensions' => 'largeur 411,hauteur 260',
'label' => 'Illustration',
'inputType' => InputType::image(),
'alt' => '',
'value' => ''
],
]
],
EngagementBlocType::bloc2()->value => [
'type' => EngagementBlocType::bloc2(),
'content' => [
'img' => [
'dimensions' => 'largeur 384,hauteur 260',
'label' => 'Illustration',
'inputType' => InputType::image(),
'alt' => '',
'value' => ''
],
'content' => [
'label' => 'Contenu',
'inputType' => InputType::text(),
'value' => ''
],
'link' => [
'label' => 'Lien du bouton en savoir +',
'inputType' => InputType::url(),
'status' => true,
'newtab' => false,
'value' => ''
]
]
],
EngagementBlocType::bloc3()->value => [
'type' => EngagementBlocType::bloc3(),
'content' => [
'img' => [
'dimensions' => 'largeur 486,hauteur 682',
'label' => 'Illustration',
'inputType' => InputType::image(),
'alt' => '',
'value' => ''
],
'title' => [
'label' => 'Titre (h2)',
'inputType' => InputType::string(),
'value' => ''
],
'content' => [
'label' => 'Contenu',
'inputType' => InputType::text(),
'value' => ''
],
'side' => [
'label' => 'Orientation de l\'image (gauche ou droite)',
'inputType' => InputType::boolean(),
'value' => ''
],
'link' => [
'label' => 'Lien du bouton en savoir +',
'inputType' => InputType::url(),
'status' => true,
'newtab' => false,
'value' => ''
],
'labels' => [
'label' => 'Labels avec titre',
'inputType' => InputType::labelArray(),
'value' => []
],
]
],
EngagementBlocType::bloc4()->value => [
'type' => EngagementBlocType::bloc4(),
'content' => [
'img' => [
'dimensions' => 'largeur 792,hauteur 792',
'label' => 'Illustration',
'inputType' => InputType::image(),
'alt' => '',
'value' => ''
],
'title' => [
'label' => 'Titre (h2)',
'inputType' => InputType::string(),
'value' => ''
],
'content' => [
'label' => 'Contenu',
'inputType' => InputType::text(),
'value' => ''
],
'side' => [
'label' => 'Orientation de l\'image (gauche ou droite)',
'inputType' => InputType::boolean(),
'value' => ''
],
'link' => [
'label' => 'Lien du bouton en savoir +',
'inputType' => InputType::url(),
'status' => true,
'newtab' => false,
'value' => ''
],
'labels' => [
'label' => 'Labels avec titre',
'inputType' => InputType::labelArray(),
'value' => []
]
]
],
EngagementBlocType::bloc5()->value => [
'type' => EngagementBlocType::bloc5(),
'content' => [
'titlePicto' => [
'dimensionsMax' => 'largeur 130,hauteur 110',
'label' => 'Pictogramme Titre',
'inputType' => InputType::image(),
'value' => ''
],
'mobileVisible' => [
'label' => 'Visible sur mobile ?',
'inputType' => InputType::boolean(),
'value' => ''
],
'images' => [
'dimensionsMax' => 'largeur 130,hauteur 110',
'label' => 'Illustrations',
'inputType' => InputType::imageArray(),
'value' => []
]
]
],
];
}
/**
* Get Label Template Data
*
* @return array
*/
public static function getLabel(): array
{
return [
'bigText' => '',
'text' => '',
'fullLine' => false
];
}
private function setContent($content): void
{
$attrs = $this->attributes;
if (isset($attrs['content'])) {
unset($attrs['content']);
}
if (is_string($content)) {
$content = sprintf('{"header" : "%s"}', $content);
} else {
$content = $this->serializeContent($content);
}
$this->setRawAttributes(\array_merge_recursive(
$attrs,
['content' => $content]
));
}
// phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh
private function serializeContent(array $content): string
{
foreach ($content as $i => $bloc) {
foreach ($bloc['content'] as $o => $input) {
switch ($input['inputType']->value ?? $input['inputType']['value']) {
case InputType::image()->value:
$content[$i]['content'][$o]['value'] = Utils::storeImage($input['value'], $this->getTable());
break;
case InputType::imageArray()->value:
foreach ($input['value'] as $k => $image) {
$content[$i]['content'][$o]['value'][$k] = Utils::storeImage($image, $this->getTable());
}
break;
case InputType::labelArray()->value:
foreach ($input['value'] as $k => $label) {
$content[$i]['content'][$o]['value'][$k] = \array_replace(
static::getLabel(),
$content[$i]['content'][$o]['value'][$k]
);
}
break;
case InputType::boolean()->value:
case InputType::text()->value:
case InputType::string()->value:
break;
case InputType::url()->value:
Utils::assertNoInternalUrls('content', $input['value']);
break;
case InputType::image2()->value:
$content[$i]['content'][$o]['value'] = Utils::storeImage($input['value'], $this->getTable());
break;
default:
throw new \Exception(sprintf(
'Unknown input Type %s',
$input['inputType']->label ?? $input['inputType']['label']
));
}//end switch
}//end foreach
}//end foreach
return json_encode($content);
}
private function storeImage($image): string
{
if (\is_object($image) and get_class($image) === UploadedFile::class) {
/** @var UploadedFile */
$image = $image;
$newPath = $this->prepareMoveFile($image->getClientOriginalName());
$newPath = str_replace(storage_path('app'), '', $newPath);
$image->storePubliclyAs(pathinfo($newPath, \PATHINFO_DIRNAME), pathinfo($newPath, \PATHINFO_BASENAME));
return '/storage' . str_replace('/public', '', $newPath);
}
if (\is_object($image) and get_class($image) === SplFileInfo::class) {
/** @var SplFileInfo */
$image = $image;
$newPath = $this->prepareMoveFile($image->getBaseName());
if (!File::copy($image->getRealPath(), $newPath)) {
throw new \Exception(sprintf(
'Failed to copy file %s to %s',
$image->getRealPath(),
$newPath
));
}
return str_replace(\storage_path('app/public'), '/storage', $newPath);
}
if (\is_string($image)) {
return $image;
}
}
private function prepareMoveFile(string $filename): string
{
$pathFolder = \storage_path('app/public/images/engagements');
if (!File::exists($pathFolder)) {
File::makeDirectory($pathFolder, 0755, true);
}
$filename = sprintf('%s-%s', Str::uuid(), $filename);
$fullPath = sprintf('%s/%s', $pathFolder, $filename);
if (File::exists($fullPath)) {
File::delete($fullPath);
}
return $fullPath;
}
}