Bu məqalədə biz Voyagerin təqdim elədiyi admin panel vasitəsi ilə laravel üçün admin paneldən səhifələr yaradıb paylaşmağı öyrənirik. Bunun üçün bizim ən azından Laravelin Model, View, Controller, Route, php artisan haqqında artıq məlumatımız olmalıdır. View çox sadə olacaq, məqsəd Voyagerdə olan “Pages” menyusundan istifadəni öyrənməkdir. Biz əgər düzgün kod qurmasaq, həmin menyudan istifadə etsək belə bəhrəsini görməyəcəyik. Uzun sözün qısası keçək əsas mətləbə.
Model və Cotroller yaradaq.
İlk addım Model yaratmağımız olacaq. Model yaradanda elə eyni zaman Controlleri də yaratmaq olur Laraveldə. Biz də bu imkandan istifadə edib növbəti kodu proyektimizin terminalında istifadə edirik:
php artisan make:model Page -c
Model.
Modelin üzərində müəyyən dəyişiklikləri edək, sonra Controllerə baxarıq. Sonda modelimiz bu cür olacaq:
...
use TCG\Voyager\Models\Page As VoyagerPageModel;
class Page extends VoyagerPageModel
{
use HasFactory;
public static function findBySlug($slug){
return static::where('slug', $slug)->first();
}
}
Biz burada yaratdığımız Page modelinin imkanlarını artırmaq üçün extends açar sözündən istifadə edib Voyagerin təqdim etdiyi Page modeldən İnheritance (miras) edirik. ←Bunu başa düşmədinizsə deməli OOP biliyiniz azdır. Sadəcə hər iki modelin adı Page olduğuna görə VoyagerPageModel aliasından istifadə edirik. Sinifin (class) daxilində “findBySlug($slug)” statik funksiyanı görə bilirsiz. Bu funksiyanı Controllerdə istifadə edəcəm ki, səhifə üçün təyin etdiyimiz “slug” vasitəsi ilə, verilənlər bazasından səhifəni əldə edək. Ümid edirəm Laravelin kodlarını izah eləməyə ehtiyac yoxdur. Funksiyanın bizə qaytardığı uğurlu cavab nümunəsi:
{
"id": 1,
"author_id": 1,
"title": "Hello World",
"excerpt": "Hang the jib grog grog blossom grapple dance the hempen jig gangway pressgang bilge rat to go on account lugger. Nelsons folly gabion line draught scallywag fire ship gaff fluke fathom case shot. Sea Legs bilge rat sloop matey gabion long clothes run a shot across the bow Gold Road cog league.",
"body": "<p>Hello World. Scallywag grog swab Cat o'nine tails scuttle rigging hardtack cable nipper Yellow Jack. Handsomely spirits knave lad killick landlubber or just lubber deadlights chantey pinnace crack Jennys tea cup. Provost long clothes black spot Yellow Jack bilged on her anchor league lateen sail case shot lee tackle.</p>",
"image": "pages/page1.jpg",
"slug": "hello-world",
"meta_description": "Yar Meta Description",
"meta_keywords": "Keyword1, Keyword2",
"status": "ACTIVE",
"created_at": "2021-12-19T16:49:35.000000Z",
"updated_at": "2021-12-20T21:29:52.000000Z"
}
Əgər səhifəni tapmasa, cavab olaraq null almalıyıq. Modelimiz haqqında yazdıq indi də keçək Controllerə.
Controller.
Artıq kontrolleri yaratmışıq, başlayaq üzərində dəyişiklikləri etməyə. Modeldə etdiyimiz kimi burada da “extends” açar sözü ilə miras (Inheritance) edirik. Burada sadəcə mirası VoyagerBaseControllerdən alırıq.
...
use TCG\Voyager\Http\Controllers\VoyagerBaseController;
class PageController extends VoyagerBaseController
{
public function pageView($slug){
$page = Page::findBySlug($slug);
if($page == null ){
return view('welcome');
}
return view('dinamic', compact('page'));
}
}
Controllerimizdə məlumatın səhifəyə göndərmək üçün “pageView” funksiyasını yaradırıq. Funksiyanın daxilində “Page” modelinin “findBySlug” funsiyası vasitəsi ilə “slug” dəyişkəninə uyğun verilənlər bazasından səhifəyə lazım olan məlumatı əldə edir və “$page” dəyişkəninə təyin edir. Sonra əgər heçnə tapılmayıbsa “$page” dəyişkəni “null” olur. O zaman sorğunu “welcome” səhifəsinə yönləndirir. Əgər məlumat tapılıbsa “dinamic” səhifəsinə yönləndirəcək və oraya “$page” dəyişkənini ötürür.
View.
Səhifəni çox sadə etmək qərarına gəldim. Hər halda siz istəyinizə uyğun dəyişdirə bilərsiniz. Model haqqında danışanda “page” dəyişkəni obyekt olaraq gəldiyini və daxilində hansı məlumat olduğunu gördük. Gəlin səhifədə bütün əsas parametrləri əks edək. Son nəticəni göstərim, sonra detallı müzakirə edək:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<title>{{$page->title}}</title>
</head>
<body class="antialiased">
<div class="container-fluid">
<h1>{{$page->title}}</h1>
<img src="{{asset('storage/'.$page->image)}}" alt="test">
<p>{{$page->excerpt}}</p>
{!! $page->body !!}
</div>
{{--Bootstrapın js əlavələri--}}
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>
Sadəcə yuxarıda olan kodu özünüzə kopyalaya bilərsiniz. Burada fikir versəniz “$page” dəyişkənindən istifadə edərək title, image, excerpt və body ötürürük. Blade istifadə etdiyimizə görə dəyişkənin nəticəsi əks olunsun deyə “{{…}}” istifadə edirik. Bir dənə body fərqli təqdim olunur. Body daxilində html təqləri olduğuna görə gərək “{!! $page →body !! }” yazaq ki, ekranda problemsiz nəticəni görək. Şəkilində əks olunması üçün, asset() funksiyasının daxilinə “ ‘storage/’.$page →image” əlavə edirik. Beləliklə kodumuza əsasən yuxarıda başlığı, sonra şəkil, sonra qısa məlumat və sonda isə kontent (yəni body) göstəriləcək. Qaldı bir dənə routu (route) da quraşdırmağa ki, sorğu gələndə kontrollerə gedib, modeldən səhifəni alsın və viewda əks etdirsin.
Route
Routumuzda sonda aşağıda gördüyünüz kimi olacaq:
Route::get('/{slug}', [PageController::class, 'pageView'])
->name('{slug}');
Slug bizim linkə ötürələcək parametrdir. Misal: laravelvoyager.local/hello-world, “hello-world” slug əvəzinə qoyulacaq və kontrollerə ötürüləcək. Routun adını da slug-a uyğun təyin edirik. Route web.php faylına əlavə edilməlidir.
Diqqətiniz üçün təşəkkür edirəm.
İanə: https://aytiqaqash.com/donate
Youtube: https://www.youtube.com/c/AyTiQaqa%C5%9F
Facebook Qrup: https://www.facebook.com/groups/aytiqaqash
Facebook Səhifə: https://www.facebook.com/aytiqaqash
Telegram Qrup: https://t.me/aytiqaqashlar
Telegram Kanal: https://t.me/aytiqaqash
İnstagram: https://www.instagram.com/aytiqaqash/
Twitter: https://twitter.com/aytiqaqash