Giriş yapmadınız.

#1 24.07.2018 15:43:13

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 105

Kalnoy Nested Set Kullanımı

Herkese merhaba arkadaşlar aranızda yeniyim. Benim şöyle bir problemim var; ben daha önce laravel ile proje geliştirirken pek nested yapısına ihtiyacım olmuyordu ancak şu anda büyük bir proje geldi ve nested yapısını kullanmaya ihtiyacım var. Ben kalnoy/nested set yapısını kullanmayı düşünüyorum uyguladığım adımlar şöyle;

Kalnoy'u composer ile yükledikten sonra model ve migration dosyası oluşturuyorum

php artisan make:model Shop -m

Daha sonra tabloya şunları ekliyorum

public function up()
    {
        Schema::create('shops', function (Blueprint $table) {
            $table->increments('id');
            $table->string('category_name');
            NestedSet::columns($table);
            $table->timestamps();
        });
    }

Sonra migrate ediyorum
Tablo görüntüsü şu şekilde
Nested-Set-in-Laravel.png

Sonra seeder oluşturuyorum

php artisan make:seeder ShopTableSeeder

Problemim burada başlıyor; seeder a nasıl dinamik olarak veri ekleyebilirim ?

Çevrimdışı

#2 24.07.2018 16:18:07

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,589
Website

Yanıt: Kalnoy Nested Set Kullanımı

Merhaba, foruma hoşgeldiniz öncelikle.

Seeding dökümanları:
https://laravel.com/docs/5.6/seeding

kalnoy/nestedset için örnek veri girişi gösterdiğim yazıma bakabilirsiniz:
http://forum.laravel.gen.tr/viewtopic.p … 004#p11004

Çevrimdışı

#3 24.07.2018 17:14:37

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 105

Yanıt: Kalnoy Nested Set Kullanımı

mgsmus yazdı:

Merhaba, foruma hoşgeldiniz öncelikle.

Seeding dökümanları:
https://laravel.com/docs/5.6/seeding

kalnoy/nestedset için örnek veri girişi gösterdiğim yazıma bakabilirsiniz:
http://forum.laravel.gen.tr/viewtopic.p … 004#p11004

Teşekkür ederim örneğinizi inceledim ama işlem kısmında anlamadığım bi nokta var, sizin verdiğiniz örnekte seed ile veri girişi yapmıyoruz galiba ?

Çevrimdışı

#4 24.07.2018 22:30:18

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,589
Website

Yanıt: Kalnoy Nested Set Kullanımı

Seeder oluşturduktan sonra aynı şekilde Seeder sınıfı içerisindeki run() yöntemi içerisinde veri girişi yapabilirsiniz.

<?php

use Illuminate\Database\Seeder;
use App\Category;

class CategorySeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $bilgisayar = Category::create(['name' => 'Bilgisayar']);
        $masaustuBilgisayar = Category::create(['name' => 'Masaüstü Bilgisayarlar']);
        $bilgisayar->appendNode($masaustuBilgisayar);
    }
}

gibi...

Çevrimdışı

#5 26.01.2019 21:43:27

torpilahmet
Üye
Yer: İstanbul
Kayıtlı: 02.02.2017
Mesajlar: 4
Website

Yanıt: Kalnoy Nested Set Kullanımı

Merhabalar,
Menü ya da kategori yapısı çoklu dil olunca nasıl bir yol izlenmeli. Önerebileceğiniz paket veya öneriniz var mı? Şimdiden teşekkür ederim

Çevrimdışı

#6 26.01.2019 22:30:24

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,589
Website

Yanıt: Kalnoy Nested Set Kullanımı

Bu paket için konuşuyorsanız yapmanız gereken ek bir işlem yok.

Çevrimdışı

#7 27.01.2019 12:06:26

torpilahmet
Üye
Yer: İstanbul
Kayıtlı: 02.02.2017
Mesajlar: 4
Website

Yanıt: Kalnoy Nested Set Kullanımı

mgsmus yazdı:

Bu paket için konuşuyorsanız yapmanız gereken ek bir işlem yok.

Merhaba, öncelikle hızlı geri dönüşünüz için teşekkürler. Bir kaç kısa sorum daha olacaktı.

public function up()
    {
        Schema::create('menus', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('parent_id')->unsigned();
            $table->integer('rank')->nullable()->default(0);
            $table->integer('isActive')->default(1);
            $table->string('image')->nullable();
            $table->softDeletes();
            $table->timestamps();
        });
    }
public function up()
    {
        Schema::create('menu_languages', function (Blueprint $table) {
                $table->increments('id');
                $table->integer('menu_id')->unsigned();
                $table->string('lang');
                $table->string('title');
                $table->string('slug');
                $table->text('about')->nullable();
            $table->timestamps();
        });
    }

1- Bu tablo yapısını pakete nasıl uyarlarım?
2- Uyarlama sonrası seçilen dilde hiyerarşik görüntülemeyi nasıl sağlarım?

Çevrimdışı

#8 27.01.2019 12:58:52

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,589
Website

Yanıt: Kalnoy Nested Set Kullanımı

menu_languages tablosunun hiyerarşik yapı ile ilgisi yok. Hiyerarşi kullanacağınız tablo menus tablosu. Zaten parent_id ekleyerek adjacency list dediğimiz yapıyı kullanmış oluyorsunuz.

Bu paket ise nested set dediğimiz yöntemi kullanıyor. parent_id yanına _lft ve _rgt şeklinde iki alana daha ihtiyacınız var. Ayrıca bunlar için index de sorguların hızlı olmasını sağlayacaktır.

Bu durumda yapıyı değiştirmeden pakete uygun hale getirmek için yeni bir migration oluşturun:

$ php artisan make:migration add_nested_set_columns_to_menus_table
public function up()
{
    Schema::create('menus', function (Blueprint $table) {
        $table->unsignedInteger(NestedSet::PARENT_ID)->nullable()->change(); // parent_id nullable olması gerekiyor. Sizin yapıda nullable değil, burada değiştiriyoruz
        $table->unsignedInteger(NestedSet::LFT)->default(0);
        $table->unsignedInteger(NestedSet::RGT)->default(0);
        $table->index(NestedSet::getDefaultColumns());
    });
}

public function down()
{
    Schema::dropIndex(NestedSet::getDefaultColumns());
    Schema::dropColumn([NestedSet::LFT, NestedSet::RGT]);
}

Bu şekilde mevcut migrasyonu bozmadan yapıyı pakete uygun hale getirmiş olursunuz.

Çevrimdışı

#9 28.01.2019 14:37:37

torpilahmet
Üye
Yer: İstanbul
Kayıtlı: 02.02.2017
Mesajlar: 4
Website

Yanıt: Kalnoy Nested Set Kullanımı

@mgsmus açıklayıcı cevaplarınız için teşekkür ederim. lazychaser/laravel-nestedset ile select Menu yaptım ve ihtiyacı olan birileri için bulunsun diye paylaşmak istedim.
Controller:

public function create()
    {
        $defaultLang = App::getLocale();
        $langs = Language::all();
        $menus  = Menu::get()->toTree();
        return view('admin.definition.menus.create', compact('langs', 'defaultLang', 'menus'));
    }

View

@extends('admin.layouts.master')

@section('script_source_top')
    <script src="{{ asset('admin') }}/global_assets/js/plugins/forms/selects/select2.min.js"></script>
    <script src="{{ asset('admin') }}/global_assets/js/plugins/forms/styling/uniform.min.js"></script>
@endsection

@section('script_source_bottom')
    <script src="{{ asset('admin') }}/global_assets/js/demo_pages/form_layouts.js"></script>
@endsection

@section('content')
    <div class="card">
        <div class="card-header header-elements-inline">
            <h5 class="card-title">{{ trans('admin_definition_menu.addNewMenu') }}</h5>

            <div class="header-elements">
                    <a href="{{route('admin.definition.menus.index')}}" class="btn btn-labeled btn-labeled-right bg-primary">{{ trans('buttons.backMenuList') }} <b><i class="icon-undo2"></i></b></a>
            </div>
        </div>

        <div class="card-body">
                <form action="{{ route('admin.definition.menus.store') }}" method="post">
                    @csrf
                    <div class="form-group">
                        <label>{{ trans('admin_definition_menu.nemuPhoto') }}:</label>
                        <input type="file" name="image" class="form-input-styled" data-fouc>
                        <span class="form-text text-muted">{{trans('admin_definition_menu.textPhotoMuted')}}</span>
                    </div>
                    <div class="form-group">
                        <label>{{trans('admin_definition_menu.chooseMenu')}}:</label>
                        <select class="form-control form-control-select2" name="parent_id" data-fouc>
                            <option value="" selected>{{trans('admin_definition_menu.mainMenu')}}</option>
                            @foreach($menus->where('parent_id', null) as $menu)
                                @if(count($menu->children) == 0)
                                    <option value="{{ $menu->id }}">
                                        @foreach($menu->lang as $lang)
                                            @if($lang->lang == $defaultLang)
                                                {{$lang->title}}
                                            @else
                                                @if($lang->lang == $defaultLang)
                                                    {{$lang->title}}
                                                @endif
                                            @endif
                                        @endforeach
                                    </option>
                                @else
                                    @if($menu->children->count())
                                        <optgroup label="
                                                @foreach($menu->lang as $lang)
                                        @if($lang->lang == $defaultLang)
                                        {{$lang->title}}
                                        @else
                                        @if($lang->lang == 'tr')
                                        {{$lang->title}}
                                        @endif
                                        @endif
                                        @endforeach">
                                            @foreach($menu->children as $child)
                                                <option value="{{ $child->id }}">
                                                    @foreach($child->lang as $lang)
                                                        @if($lang->lang == $defaultLang)
                                                            {{$lang->title}}
                                                        @else
                                                            @if($lang->lang == $defaultLang)
                                                                {{$lang->title}}
                                                            @endif
                                                        @endif
                                                    @endforeach
                                                </option>
                                            @endforeach
                                        </optgroup>
                                    @endif
                                @endif
                            @endforeach
                            {{--<optgroup label="Pacific Time Zone">--}}
                                {{--<option value="CA">California</option>--}}
                                {{--<option value="NV">Nevada</option>--}}
                                {{--<option value="WA">Washington</option>--}}
                            {{--</optgroup>--}}

                        </select>
                    </div>
                    <div class="d-md-flex">
                        <ul class="nav nav-tabs nav-tabs-vertical flex-column mr-md-3 wmin-md-200 mb-md-0 border-bottom-0">
                            @foreach($langs as $lang)
                                <li class="nav-item"><a href="#{{$lang->lang}}" class="nav-link @if($lang->active == 1) active @endif" data-toggle="tab">
                                        <img src="{{ asset("uploads/images/flag/$lang->flag") }}" alt="" width="30">&nbsp; {{ $lang->title }}</a></li>
                            @endforeach
                        </ul>

                        <div class="tab-content col-md-8">
                            @foreach($langs as $lang)
                                <div class="tab-pane fade show @if($lang->active == 1) active @endif" id="{{$lang->lang}}">
                                    <input type="hidden" name="lang[]" value="{{ $lang->lang }}">
                                    <div class="form-group">
                                        <label>{{trans('admin_definition_menu.menuName')}}:</label>
                                        <input type="text" name="title[]" class="form-control">
                                    </div>
                                    <div class="form-group">
                                        <label>{{ trans('admin_definition_menu.nemuAbout') }}:</label>
                                        <textarea rows="5" cols="5" class="form-control" name="about[]" placeholder="Enter your message here"></textarea>
                                    </div>
                                </div>

                            @endforeach
                        </div>
                    </div>
                    <div class="text-right">
                        <button type="submit" class="btn btn-primary">Submit form <i class="icon-paperplane ml-2"></i></button>
                        </div>
                    </form>
                <!-- /basic layout -->
        </div>
    </div>
@endsection

Son düzenleyen torpilahmet (28.01.2019 21:50:11)

Çevrimdışı

Forum alt kısmı