ldc-wenn-dann-mit-respekt/app/Http/Controllers/Fo/NewsController.php
2025-07-16 16:19:37 +02:00

81 lines
2.7 KiB
PHP

<?php
namespace App\Http\Controllers\Fo;
use App\Enums\StaticPageType;
use App\Http\Controllers\Controller;
use App\Models\News;
use App\Models\StaticPage;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class NewsController extends Controller
{
/**
* News index
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function index(Request $request): \Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
{
$staticPageModel = StaticPage::query()->where('type', StaticPageType::newsPlural)->firstOrFail();
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) => str($this->renderNews($newsModel))->toBase64()));
}
return view('fo.pages.news.index', compact('staticPageModel'));
}
/**
* Product show
*
* @param \App\Models\News $publishedNews
* @return \Illuminate\Contracts\View\View
*/
public function show(News $publishedNews): \Illuminate\Contracts\View\View
{
$staticPageModel = StaticPage::query()->where('type', StaticPageType::newsPlural)->firstOrFail();
$currentLocale = app()->currentLocale();
$relatedNewsList = News::query()
->where('id', '!=', $publishedNews->id)
->where('status', true)
->whereJsonContains('locales', $currentLocale)
->orderBy('order', 'DESC')
->limit(2)->get();
return view('fo.pages.news.show', [
'staticPageModel' => $staticPageModel,
'newsModel' => $publishedNews,
'relatedNewsList' => $relatedNewsList
]);
}
/**
* 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();
$pictures = $newsModel->picture_list;
return Cache::remember(
"NewsRendered_{$locale}_{$newsModel->id}_{$newsModel->updated_at}",
60,
fn () => \view(
'fo.pages.news.bloc',
[
'newsModel' => $newsModel,
'pictures' => $pictures
]
)->render()
);
}
}