ile

Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-9 Şablonlar

Bu yazı Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-8 -Web Arayüzü yazısının devamıdır. Önce onu okumanızı öneririm.

View story at Medium.com


Bir önceki yazıda View yani görünüm sınıflarından bahsettik ve EntryView adında bir sınıf oluşturduk. Veriyi HTML kodlarıyla render metodunun içinde sardık ve sunumunu yaptık. Şimdi aynı render metodunu bir template yani şablon metodu kullanacak şekilde değiştirelim.

<?php

namespace
MidoriKocak;

class EntryView
{
private $entry;

public function __construct(EntryInterface $entry = null)
{
if ($entry !== null) {
$this->entry = $entry;
}
}

private function template(EntryInterface $entry)
{
$title = "<h3>" . $entry->getKey() . "</h3>";
$values = $entry->getValues();
$list = "";
foreach ($values as $value) {
$list .= "<li>" . $value . "</li>";
}

$result = "<p class='entry'>" . $title . "<ol class='values'>" . $list . "</ol>" . "</p>";

return $result;
}

public function setEntry(EntryInterface $entry)
{
$this->entry = $entry;
}

public function render()
{
if (!isset($this->entry)) {
throw new Exception('Cannot render without entry');
}

return $this->template($this->entry);
}
}

Bu kodda, önce private yani özel bir template metodu oluşturduk. Dikkat ettiyseniz Template metodu içindeki $this kullanmadık değişkenleri, $this ifadesinden kurtardık. Kodumuz bu haliyle de aynı şekilde çalışacak. Ancak bizim amacımız mümkün olduğunca PHP kodu ile HTML kodlarını birbirinden ayırmak. Bunun için içinde bulunduğumuz dizinde Template adında bir klasör oluşturalım ve bu dizinin içinde entry.php adında bir dosya oluşturalım. entry.php dosyasının içeriği şöyle olsun:

<p class="entry">
<h3><?= $entry->getKey() ?></h3>
<ol class="values">

<?php foreach ($entry->getValues() as $value): ?>

<li><?= $value ?></li>

<?php endforeach; ?>

</ol>
</p>

Not: Buraya böyle salak salak boşluklar koymamın sebebi, kısa foreach yani süslü parantez yerine iki nokta ile biten döngü kullandığımda, html dosyası olarak çıktısı alınacak php dosyasında, php etiketlerinin, indentasyonu, yani html etiketlerinin hizalanmasını bozması. Normalde, performans için, etiket dışındaki bütün bu boşluk ve yeni satır karakterlerini siliyoruz, ancak ben kitapta kod örneklerinin düzgün olması için bu boşlukları koydum.


Şimdi EntryView dosyasına dönüp template metodunun içeriğini şöyle değiştirelim:

private function template(EntryInterface $entry)
{
ob_start();
require 'Template/entry.php';
return ob_get_clean();
}

Yepyeni iki metod ile karşı karşıyayız. Output buffer yani ob_start() metodu, php’de ekrana basılacak olan herşeyi kaydetmeye yarar. Yani ob_start dediğimiz anda echo diyerek veya örneğin burada require diyerek çağırdığımız dosyanın metin içeriğini kamera gibi kaydetmeye başlıyoruz. ob_end_clean() metodu ise bu kaydettiğimiz şeyleri döndürür ve kaydettiğimiz output buffer denen zımbırtıyı siler. Bu sayede, tema dosyalarını kullanabilir, onları istediğimiz zaman ekrana istediğimiz değişkenlerle basabiliriz.


Şimdi, Template dizinimiz içinde dictionary.php isminde ikinci bir dosya oluşturalım. Bu yazacağımız DictionaryView yani Sözlük Görünüm sınıfımızın tema/şablon dosyası olacak. İçeriğini şu şekilde oluşturup kaydedelim:

<p class="dictionary">
<h2><?= $dictionary->getTitle() ?></h2>

<?php foreach ($dictionary->getEntries() as $entry): ?>

<p class="entry">
<h3><?= $entry->getKey() ?></h3>
<ol class="values">

<?php foreach ($entry->getValues() as $value): ?>

<li><?= $value ?></li>

<?php endforeach; ?>

</ol>
</p>

<?php endforeach; ?>

</p>

Daha sonra bir üst klasörde DictionaryView.php adlı bir dosya oluşturalım. İçi de şöyle olsun:

<?php

namespace
MidoriKocak;

class DictionaryView
{
private $dictionary;
private $entryView;

public function __construct(DictionaryInterface $dictionary)
{
$this->dictionary = $dictionary;
}

private function template(DictionaryInterface $dictionary)
{
ob_start();
require 'Template/dictionary.php';
return ob_get_clean();
}

public function render()
{
if (!isset($this->dictionary)) {
throw new Exception('Cannot render without dictionary');
}

return $this->template($this->dictionary);
}
}

Bişi dikkatinizi çekti mi? EntryView ve DictionaryView dosyaları birbirine benzemeye başladı. Kod tekrarını önlemek için ne yapıyorduk? Kodları birleştirip başka bir yere referans veriyorduk. Kalıtım konusuna geldiğimizde bu konuya detaylı olarak değineceğim.

Şimdi app.php dosyamızı, DictionaryView adlı yeni dosyamızı kullanacak şekilde değiştirelim.

<?php

require_once 'DictionaryInterface.php'
;
require_once 'Dictionary.php';
require_once 'EntryInterface.php';
require_once 'Entry.php';
require_once 'EntryView.php';
require_once 'DictionaryView.php';

try {
$dictionary = new MidoriKocakDictionary("Nesne Yönelimli Programlama Sözlüğü");

$nesne = new MidoriKocakEntry('nesne', 'aklımızın dışındaki herşey');

$nesne->addValue('harika bişi');
$nesne->addValue('ingilizce object');

$şey = new MidoriKocakEntry('şey', 'ismi olmayan nesne');

$dictionary->addEntry($nesne);
$dictionary->addEntry($şey);

$entriesArray = $dictionary->getEntriesAsArray();

$entries = $dictionary->getEntries();
$dictionaryView = new MidoriKocakDictionaryView($dictionary, new MidoriKocakEntryView());

echo $dictionaryView->render();

} catch (Exception $e) {
echo 'Error on line ' . $e->getLine() . ' in ' . $e->getFile()
. ': <b>' . $e->getMessage();
}

Herşeyi tamamladığımıza göre tarayıcımızı açalım:

Sözlük Görünümü

Gördüğümüz gibi, sözlüğümüzün başlığını ekrana bastık, daha sonra sözlüğün sahip olduğu girdilere göre verileri listelemeye başladık, her girdinin başlığını ve içlerindeki her açıklamayı ekrana bastık. Bunları yapmak için de tema dosyaları kullandık. Şimdi sayfamızın kaynağına bakalım.

Sayfa Kaynağı

İşte şimdi sayfamız birbirine girmiş etiketler yumağı yerine doğru dürüst bir HTML sayfasına benzedi. Peki bu düzgün formatlı bir html sayfası mı? Hayır, sadece dümdüz verileri listeliyoruz. Hala bir uygulamaya benzemiyor. Bir sonraki yazıda, tasarımını yaptığımız uygulamamızın sayfa düzenlerini nasıl oluşturup kullanacağımızı öğreneceğiz.

Bir sonraki yazıya buradan erişebilirsiniz:

View story at Medium.com


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Yorumla

Yorum