PHP

Nested Menus

26.11.2021 5 dəq oxuma Yeniləndi: 30.11.2021

 1.2021_11_25_223635_create_ menus_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMenusTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('menus', function (Blueprint $table) {
            $table->id();
            $table->string('menu_adi');
            $table->string('title')->nullable();
            $table->text('my_content')->nullable();
            $table->string('url');
            $table->boolean('type')->default(0)->comment('0 - static, 1 - dynamic');
            $table->tinyInteger('parent')->default(0)->comment('0 - parent, else child');
            $table->boolean('hide')->default(0)->comment('0 - not hide, 1 - hide');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('menus');
    }
}

2.App\Models\Menu.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Menu extends Model
{
    use HasFactory;

    protected $table = 'menus';

    protected $guarded = [];

    public function parent()
    {
        return $this->belongsTo(Menu::class, 'parent', 'id');
    }

    public function children()
    {
        return $this->hasMany(Menu::class, 'parent', 'id');
    }

    public function getParent()
    {
        return $this->hasOne(Menu::class,'id','parent');
    }

}

3.App\Providers\AppServiceProvider.php 

<?php

namespace App\Providers;

use App\Models\Menu;
use App\Models\Option;
use App\Models\Qanunvericilik;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $menus          = [];
        if (Schema::hasTable('menus'))
        {
            $menus = Menu::all();
        }

        return view()->share('data', [
            'menus'=>$menus
        ]);
    }
}

4.resources/views/front/ includes/ menu.blade.php

<!-- Navbar Start -->
<div class="site-navigation navbar-fixed">
    <div class="container">
        <div class="row">
            <div class="col-lg-12">
                <nav class="navbar navbar-expand-lg navbar-dark p-0">
                    <button class="navbar-toggler" type="button" data-toggle="collapse"
                            data-target=".navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false"
                            aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                    </button>

                    <div id="navbar-collapse" class="collapse navbar-collapse">
                        <ul class="nav navbar-nav mr-auto">
                            @foreach($data['menus'] as $menu)
                            @if($menu->parent == 0)
                                @include('front.includes.drop-menu-item', $menu)
                            @endif
                            @endforeach
                        </ul>
                    </div>
                </nav>
            </div>
            <!--/ Col end -->
        </div>
        <!--/ Row end -->

        <div class="nav-search">
            <span id="search"><i class="fas fa-search"></i></span>
        </div><!-- Search end -->

        <div class="search-block" style="display: none;">
            <label for="search-field" class="w-100 mb-0">
                <form action="{{ route('front.axtar') }}" method="GET">
                    @csrf
                <input type="text" name="axtar" class="form-control" id="search-field" placeholder="Axtar" required>
                </form>
            </label>
            <span class="search-close">&times;</span>
        </div><!-- Site search end -->
    </div>
    <!--/ Container end -->
</div>
<!-- Navbar End -->

5.resources/views/front/includes/drop-menu-item.blade.php

<li class="nav-item {{ $menu->children->count() > 0 ? 'dropdown' : '' }}" style="display: {{ $menu->hide == 0 ? 'block' : 'none' }}">
    <a href="{{ $menu->url }}" class="nav-link {{ $menu->children->count() > 0 ? 'dropdown-toggle' : '' }}" style="color: #000000" {{ $menu->children->count() > 0 ? 'data-toggle="dropdown"' : '' }}>{{ $menu->menu_adi }} {!! $menu->children->count() > 0 ? '<i class="fa fa-angle-down"></i>' : '' !!}</a>

    @if ($menu->children->count() > 0 )
        <ul class="dropdown-menu" role="menu">
            @foreach($menu->children as $sub_menu)
                @if ($sub_menu->children->count() > 0 )

                    <li class="dropdown-submenu">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> <span class="nav-label">{{ $sub_menu->menu_adi }}</span><span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            @foreach($sub_menu->children as $menu)
                                @include('front.includes.drop-menu-item', $menu)
                            @endforeach
                        </ul>
                    </li>
                @else
                    <li><a href="{{ $sub_menu->url }}">{{ $sub_menu->menu_adi }}</a></li>
                @endif
            @endforeach
        </ul>
    @endif
</li>

Delete nested menus

6.

<?php

namespace App\Http\Controllers\back;

use App\Http\Controllers\Controller;
use App\Models\Menu;
use Illuminate\Http\Request;

class settingsController extends Controller
{
    public function menuDelete($id)
    {
        $menu       = Menu::findOrFail($id);

        $output     = '';
        $output    .= $menu->id.',';
        $output    .= $this->nestMenus($menu);

        $ids        = array_filter(explode(',',$output));
        Menu::destroy($ids);

        toastSuccess('Data uğurla silindi');
        return redirect()->back();
    }

    public function nestMenus($array)
    {
        $output = '';
        if ($array->children->count() > 0)
        {
            foreach ($array->children as $child)
            {
                if ($child->children->count() > 0)
                {
                    $array       = $child;
                    $output     .= $child->id.',';
                    $output     .= $this->nestMenus($array);
                }
                else
                {
                    $output     .= $child->id.',';
                }
            }

            return $output;
        }
        else
        {
            return $output;
        }
    }
}

 

Digər dildə: EN