Yisibi
merhaba sınırsız alt kategori oluşturmak istiyorum. bu kodu nasıl duzenleye bilim?
yalnız ana kategori ve birde alt kategori mövucud.
<?php
namespace App\Http\Controllers\Categories;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use DB;
use App\Models\Ad;
use App\Models\Category;
use Carbon\Carbon;
use Helper;
use SEO;
use SEOMeta;
use Protocol;
use Theme;
/**
* CategoriesController
*/
class CategoriesController extends Controller
{
public $theme = '';
function __construct()
{
$this->theme = Theme::get();
}
/**
* Get Categories
*/
public function category(Request $request, $parent, $sub=null)
{
// Check category
$parent_category = DB::table('categories')->where('category_slug', $parent)->where('is_sub', false)->first();
if ($parent_category) {
if ($sub) {
// Check sub category
$sub_category = DB::table('categories')->where('category_slug', $sub)->where('parent_category', $parent_category->id)->first();
if ($sub_category) {
// Get filters
$date = $request->get('date');
$status = $request->get('status');
$condition = $request->get('condition');
// Check Date
if ($date) {
switch ($date) {
case 'today':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereRaw('Date(created_at) = CURDATE()')->orderBy('id', 'desc')->paginate(30);
break;
case 'yesterday':
$yesterday = date("Y-m-d", strtotime( '-1 days' ) );
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereDate('created_at', $yesterday )->orderBy('id', 'desc')->paginate(30);
break;
case 'week':
$fromDate = Carbon::now()->subDays(8)->format('Y-m-d');
$tillDate = Carbon::now()->format('Y-m-d');
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereBetween( DB::raw('date(created_at)'), [$fromDate, $tillDate] )->orderBy('id', 'desc')->paginate(30);
break;
case 'month':
$fromDate = Carbon::now()->subDays(31)->format('Y-m-d');
$tillDate = Carbon::now()->format('Y-m-d');
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereBetween( DB::raw('date(created_at)'), [$fromDate, $tillDate] )->orderBy('id', 'desc')->paginate(30);
break;
case 'year':
$fromDate = Carbon::now()->subDays(366)->format('Y-m-d');
$tillDate = Carbon::now()->format('Y-m-d');
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->whereBetween( DB::raw('date(created_at)'), [$fromDate, $tillDate] )->orderBy('id', 'desc')->paginate(30);
break;
default:
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);
break;
}
}elseif ($status) {
switch ($status) {
case 'featured':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_featured', 1)->orderBy('id', 'desc')->paginate(30);
break;
case 'normal':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_featured', 0)->orderBy('id', 'desc')->paginate(30);
break;
default:
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);
break;
}
}elseif ($condition) {
switch ($condition) {
case 'used':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_used', 1)->orderBy('id', 'desc')->paginate(30);
break;
case 'new':
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->where('is_used', 0)->orderBy('id', 'desc')->paginate(30);
break;
default:
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);
break;
}
}else{
// Get Ads
$ads = Ad::where('category', $sub_category->id)->where('status', 1)->where('is_trashed', 0)->where('is_archived', 0)->orderBy('id', 'desc')->paginate(30);
}
// Get Stores
$stores = DB::table('stores')->where('category', $sub_category->id)->where('status', 1)->orderByRaw('RAND()')->take(10)->get();
// Send data
$data = array(
'ads' => $ads,
'sub' => $sub,
'parent' => $parent,
'stores' => $stores,
);
// Get Tilte && Description
$title = Helper::settings_general()->title;
$long_desc = Helper::settings_seo()->description;
$keywords = Helper::settings_seo()->keywords;
// Manage SEO
SEO::setTitle($sub_category->category_name.' | '.$title);
SEO::setDescription($long_desc);
SEO::opengraph()->setUrl(Protocol::home().'/category/'.$parent.'/'.$sub);
SEOMeta::addKeyword([$keywords]);
return view($this->theme.'.categories.category')->with($data);
}else{
// Not found
return abort(404);
}
}else{
// Get Parent category sub categories
$sub_categories = Category::where('parent_category', $parent_category->id)->where('is_sub', 1)->get();
// Get latest ads
$latest_ads = Ad::where('status', 1)->where('is_archived', 0)->where('is_trashed', 0)->where('category', $parent_category->id)->orderBy('id', 'desc')->paginate(20);
// Get Tilte && Description
$title = Helper::settings_general()->title;
$long_desc = Helper::settings_seo()->description;
$keywords = Helper::settings_seo()->keywords;
// Manage SEO
SEO::setTitle($parent_category->category_name.' | '.$title);
SEO::setDescription($long_desc);
SEO::opengraph()->setUrl(Protocol::home().'/category/'.$parent);
SEOMeta::addKeyword([$keywords]);
return view($this->theme.'.categories.parent')->with([
'sub_categories' => $sub_categories,
'parent_category' => $parent_category,
'latest_ads' => $latest_ads,
]);
}
}else{
// Not found
return abort(404);
}
}
}
mgsmus
// Önce alt kategoriyi çekiyorsunuz. Örneğin:
$slug = 'ornek-alt-kategori';
$sub = DB::table('categories')->where('category_slug', $slug)->where('is_sub', true)->first();
// Daha sonra buna alt kategori ekliyorsunuz
$newSub = DB::table('categories')->insert([
'is_sub' => true,
'name' => 'Yeni alt kategori',
'slug' => 'yeni-alt-kategori',
'parent_category' => $sub->id // Bu kısıma üst kategorinin id'si işleniyor.
]);
Burada sizin yazdığınız koddan Builder ile hazırladım. Eğer kategori için model varsa onunla daha kolay olacaktır:
$category = Category::where('category_slug', $slug)->where('is_sub', true)->first();
$newSub = $category->children()->create([
'is_sub' => true,
'name' => 'Yeni alt kategori',
'slug' => 'yeni-alt-kategori',
]);
gibi.
Ek olarak:
Adjacency list üzerinde kolay işlemler yapmak için, örneğin çocukları getir, tüm alt kategorileri getir vs... gibi, şu kütüphaneyi kullanabilirsiniz:
https://github.com/BlueM/Tree
Sizin yapınıza göre şöyle olabilir:
$categories = DB::table('categories')->select(['id','name','slug','parent_category'])->get()->toArray();
$tree = new BlueM\Tree($categories,[
'rootId' => null, // burada ana (kök) kategorilerin parent_category değerini null varsayıyorum. Eğer 0 olarak tutuluyorsa 0 yazacaksınız
'id' => 'id',
'parent' => 'parent_category'
]);
// $categories değerinin şöyle bir yapı olduğunu farzedin:
/*
[
['id' => 1, 'parent_category' => 0, 'name' => 'Bilgisayar'],
['id' => 2, 'parent_category' => 1, 'name' => 'Dizüstü'],
['id' => 3, 'parent_category' => 2, 'name' => 'Oyuncu Dizüstü'],
];
*/
$node = $tree->getNodeById(3);
$nodeAndAncestors = array_reverse($node->getAncestorsAndSelf());
$breadcrumbs = '<ol>';
foreach ($nodeAndAncestors as $ancestor) {
$breadcrumbs .= '<li><a href="'.route('category', $ancestor->get('slug')).'">'.$ancestor->get('name').'</a></li>';
}
$breadcrumbs .= '</ol>';
/*
<!-- Örnek çıktı -->
<ol>
<li><a href="/kategori/bilgisayar">Bilgisayar</a></li>
<li><a href="/kategori/dizustu">Dizüstü</a></li>
<li><a href="/kategori/oyuncu-dizustu">Oyuncu Dizüstü</a></li>
</ol>
*/