File: /home/armgroup/libs/app/Http/Controllers/Frontend/ArticleController.php
<?php
namespace App\Http\Controllers\Frontend;
use App\Http\Controllers\Controller;
use App\Models\Article;
use App\Models\Category;
use App\Models\Product;
use Artesaos\SEOTools\Facades\SEOTools;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class ArticleController extends Controller
{
protected $pageLimit = 30;
public function index()
{
$title = settings('articles-title');
$description = settings('articles-description');
SEOTools::setTitle($title);
SEOTools::setDescription($description);
$categories = Cache::rememberForever('article-categories', function () {
return Category::where('status', true)
->where('type', Article::class)
->whereNull('parent_id')
->get(['id', 'name', 'slug']);
});
$search = request('search');
$articles = Article::where('status', true)
->when($search, function ($query, $search) {
return $query->where(function ($q) use ($search) {
$q->where('title', 'LIKE', '%'.$search.'%')
->orWhere('description', 'LIKE', '%'.$search.'%');
});
})->latest('id')
->paginate($this->pageLimit);
return view('frontend.articles.index', compact('articles', 'categories', 'title', 'description'));
}
public function show(Article $article)
{
abort_unless(checkStatusAndPermission($article, 'manage articles'), 404);
$article->load('categories');
SEOTools::setTitle($article->title);
SEOTools::setDescription($article->description);
if ($article->image) {
SEOTools::addImages([asset($article->image)]);
}
$categories = Cache::rememberForever('article-categories', function () {
return Category::where('status', true)
->where('type', Article::class)
->whereNull('parent_id')
->get(['id', 'name', 'slug']);
});
$relatedProducts = DB::table('products')
->join('categorizables', 'categorizables.categorizable_id', '=', 'products.id')
->where('categorizables.categorizable_type', Product::class)
->join('article_category', 'article_category.category_id', '=', 'categorizables.category_id')
->where('article_category.article_id', $article->id)
->where('products.status', true)
->selectRaw('products.name, products.slug')
->get();
$articles = Article::query()
->where('id', '<>', $article->id)
->where('status', true)
->latest('id')
->limit($this->pageLimit)
->get(['id', 'title', 'slug', 'image']);
return view('frontend.articles.show', compact('article', 'categories', 'articles', 'relatedProducts'));
}
public function category(Category $category)
{
$title = $category->name;
$description = $category->description;
SEOTools::setTitle($category->name);
SEOTools::setDescription($category->short_description);
$categories = $category->activeChildren;
$search = request('search');
$articles = Article::where('status', true)
->whereRelation('categories', 'id', $category->id)
->when($search, function ($query, $search) {
return $query->where(function ($q) use ($search) {
$q->where('title', 'LIKE', '%'.$search.'%')
->orWhere('description', 'LIKE', '%'.$search.'%');
});
})->latest('id')
->paginate($this->pageLimit);
return view('frontend.articles.index', compact('articles', 'categories', 'title', 'description'));
}
}