Blog detay sayfası görünümü için oluşturulacak urlnin şu şekilde olacağını varsayalım: /blog/{blog_id}
Yani 1 id li blog için blog detay sayfası "/blog/1" şeklinde olmalıdır.
Bunun için daha önce hazırladığımız "Görüntülenebilir Sorgu" da bulunan Sonuç alanlarına blog tablosunun ID kolonunu da ekliyoruz.
Twig dosyasında bulunan linki aşağıdaki gibi değiştiriyoruz:
<div class="{{ view.classes|join(" ") }}" {{ view.renderAttributes() }}>
{% for row in view.data %}
<div class="card m-2">
<div class="card-body">
<h5 class="card-title">{{ row.title }}</h5>
<p class="card-text">{{ row.body|raw }}</p>
<a href="{{ constant("BASE_URL") }}/blog/{{ row.ID }}" class="btn btn-primary">{{ t("view") }}</a>
</div>
</div>
{% endfor %}
</div>
BASE_URL: Uygulamanın çalıştığı dizini yani public_html dizinini ifade eder.
Buton isminde çeviri kullandığımız için "view" anahtarı için İngilizce -> View, Türkçe -> Görüntüle çevirisini ekliyoruz.
/blog linki App\Controller\BlogController tarafından kontrol edildiği için bu sınıfın üzerinde değişiklik yapacağız.
<?php
namespace App\Controller;
use App\Entity\Blog;
use App\Queries\BlogQuery;
use App\Theme\CustomTheme;
use CoreDB\Kernel\BaseController;
use CoreDB\Kernel\Router;
use Src\Controller\NotFoundController;
use Src\Entity\Translation;
use Src\Form\SearchForm;
use Src\Theme\ThemeInteface;
class BlogController extends BaseController
{
public $blogForm;
public ?Blog $blog = null;
public function getTheme(): ThemeInteface
{
return new CustomTheme();
}
public function checkAccess(): bool
{
return true;
}
public function preprocessPage()
{
if (@$this->arguments[0]) {
$this->blog = Blog::get($this->arguments[0]);
if (!$this->blog) {
Router::getInstance()->route(NotFoundController::getUrl());
}
$this->setTitle($this->blog->title);
} else {
$this->setTitle(Translation::getTranslation("blog"));
$this->blogForm = SearchForm::createByObject(BlogQuery::getInstance());
$this->blogForm->addClass("p-3");
}
}
public function echoContent()
{
if ($this->blog) {
return $this->blog->body;
} else {
return $this->blogForm;
}
}
}
Controller sınıflarında "$this->arguments" ile ifade edilen değer url üzerinde Controller yolundan sonra verilen parametreleri ifade eder.
Burada BlogController için yol "/blog" dur. "/blog/1" şeklinde bir url oluşması durumunda arguments dizisinin 0 indisi 1 olur. / ile ayrılan diğer url parametreleri de sırayla arguments dizine eklenir.
Eğer url üzerinden blog ID si belirtilmiş ise bu ID ye sahip blog kaydı veritabanından okunur. Blog kaydı bulunmaması durumunda Router kullanılarak 404 "bulunamadı" sayfası yüklenir.
Eğer bulunmuş ise sayfanın başlığı blog başlığı olarak ayarlanır.
echoContent metodunda da eğer blog yüklenmiş ise blog un body alanı sayfada yazdırılır, yoksa blog arama formu gösterilir.
Bu şekildeki kod yapısında sayfanın görüntülenmesi halinde blog gövde gösterimi kapsayıcı kart ile çok bitisik olacaktır. Biraz girinti vermek için echoContent metodu şu şekilde değiştirilebilir:
public function echoContent()
{
if ($this->blog) {
return TextElement::create($this->blog->body)
->setIsRaw(true)
->addClass("p-3");
} else {
return $this->blogForm;
}
}
Son durumda listeleme sayfasının görünümü aşağıdaki gibidir:
Blog detay sayfasının görünümü ise şu şekildedir: