- Add toastify css to front - Bump kwaadpepper/image-resizer with fit option - Enhance news picture size to 770x770
92 lines
3.1 KiB
PHP
92 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Fo;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\News;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
class NewsController extends Controller
|
|
{
|
|
/**
|
|
* News index
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
if ($request->wantsJson()) {
|
|
$currentLocale = app()->currentLocale();
|
|
$newsList = News::query()
|
|
->where('status', true)
|
|
->whereJsonContains('locales', $currentLocale)
|
|
->orderBy('order')
|
|
->paginate();
|
|
return \response()->json(\collect($newsList->items())
|
|
->map(fn ($newsModel) => $this->renderNews($newsModel)));
|
|
}
|
|
return view('fo.pages.news.index');
|
|
}
|
|
|
|
/**
|
|
* Product show
|
|
*
|
|
* @param \App\Models\News $publishedNews
|
|
* @return \Illuminate\Contracts\View\View
|
|
*/
|
|
public function show(News $publishedNews)
|
|
{
|
|
return view('fo.pages.news.show', ['newsModel' => $publishedNews]);
|
|
}
|
|
|
|
/**
|
|
* Render a news for JS usage (ajax)
|
|
*
|
|
* @param \App\Models\News $newsModel
|
|
* @return string Base64 rendered view.
|
|
*/
|
|
private function renderNews(News $newsModel): string
|
|
{
|
|
$locale = \app()->currentLocale();
|
|
return Cache::remember(
|
|
"NewsRendered_{$locale}_{$newsModel->id}_{$newsModel->updated_at}",
|
|
60,
|
|
function () use ($newsModel) {
|
|
$pictures = $this->filterPictures(\collect($newsModel->data))->all();
|
|
return \base64_encode(\view(
|
|
'fo.pages.news.bloc',
|
|
[
|
|
'newsModel' => $newsModel,
|
|
'pictures' => $pictures
|
|
]
|
|
)->render());
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Filter pictures
|
|
*
|
|
* @param \Illuminate\Support\Collection $inputs
|
|
* @return \Illuminate\Support\Collection
|
|
*/
|
|
private function filterPictures(Collection $inputs): Collection
|
|
{
|
|
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
|
|
return $inputs->filter(fn ($value, $key) => \preg_match('/bloc[0-9]+/u', $key) !== false)
|
|
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
|
|
->groupBy(fn ($value, $key) => \collect(\explode('_', $key))->take(2)->implode('_'))
|
|
->filter(fn (Collection $blocks) => \collect($blocks->first())->get('value'))
|
|
->map(function (Collection $blocks) {
|
|
$pictureBlock = (object)$blocks->last();
|
|
return (object)[
|
|
'value' => $pictureBlock->value,
|
|
'title' => $pictureBlock->title,
|
|
'alt' => $pictureBlock->alt
|
|
];
|
|
});
|
|
}
|
|
}
|