51 lines
1.5 KiB
PHP
51 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\View\Components\Front\News;
|
|
|
|
use App\Models\News;
|
|
use App\Models\NewsTag;
|
|
use App\Models\NewsCategory;
|
|
use Illuminate\View\Component;
|
|
|
|
class NewsNextEventComponent extends Component
|
|
{
|
|
/** @var array<\App\Models\News> $nextEvents List of published news. */
|
|
public $nextEvents;
|
|
|
|
/**
|
|
* Create a new component instance.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$newsCategory = NewsCategory::getModelsCached()
|
|
->filter(fn($category) => $category->getTranslation('slug', 'fr') === "actualites")
|
|
->first();
|
|
|
|
$eventTag = NewsTag::getTagsByCategoryInCurrentLocale($newsCategory->slug)
|
|
->filter(fn($tag) => $tag->getTranslation('slug', 'fr') === "evenement")
|
|
->first();
|
|
|
|
$eventTagId = $eventTag ? $eventTag->id : null;
|
|
|
|
$this->nextEvents = News::getPublishedNewsByCategoryInCurrentLocale($newsCategory->slug)
|
|
->filter(function ($news) use ($eventTagId) {
|
|
return $news->tags->contains(
|
|
fn ($tag) => $eventTagId === $tag->id
|
|
);
|
|
})
|
|
->sortByDesc('published_at')
|
|
->take(3);
|
|
}
|
|
|
|
/**
|
|
* Get the view / contents that represent the component.
|
|
*
|
|
* @return \Illuminate\Contracts\View\View
|
|
*/
|
|
public function render(): \Illuminate\Contracts\View\View
|
|
{
|
|
return view('components.front.news.news-next-event-component', [
|
|
'nextEvents' => $this->nextEvents
|
|
]);
|
|
}
|
|
}
|