Gönderi Oluşturma ve Düzenleme
Bu harika! Süper havalı yeni bir blogumuz var, insanlar yorumlarda hararetle tartışıyor ve sonunda biraz daha programlama yapmak için zamanımız var. Adminer harika bir araç olmasına rağmen, yeni blog gönderileri yazmak için pek ideal değil. Muhtemelen uygulamadan doğrudan yeni gönderiler eklemek için basit bir form oluşturmanın tam zamanı. Hadi yapalım.
Kullanıcı arayüzünü tasarlayarak başlayalım:
- Ana sayfaya “Yeni gönderi yaz” bağlantısını ekleyin.
- Bu bağlantı, gönderinin içeriği için bir başlık ve bir metin alanı içeren bir form görüntüleyecektir.
- Kaydet düğmesine tıkladığımızda, gönderi veritabanına kaydedilecektir.
Daha sonra ayrıca giriş yapma ekleyeceğiz ve gönderi eklemeyi yalnızca giriş yapmış kullanıcılara izin vereceğiz. Ama bu daha sonra. Her şeyin çalışması için şimdi hangi kodu yazmamız gerekiyor?
- Gönderi eklemek için bir form içeren yeni bir presenter oluşturun.
- Form başarıyla gönderildikten sonra çalışacak ve yeni gönderiyi veritabanına kaydedecek bir geri arama tanımlayın.
- Bu formun olacağı yeni bir şablon oluşturun.
- Ana sayfa şablonuna forma bir bağlantı ekleyin.
Yeni Presenter
Yeni presenter'ı EditPresenter
olarak adlandıracağız ve app/Presentation/Edit/
içine
kaydedeceğiz. Ayrıca veritabanına bağlanması gerekiyor, bu yüzden burada yine veritabanı bağlantısı gerektirecek bir
yapıcı yazacağız:
<?php
namespace App\Presentation\Edit;
use Nette;
use Nette\Application\UI\Form;
final class EditPresenter extends Nette\Application\UI\Presenter
{
public function __construct(
private Nette\Database\Explorer $database,
) {
}
}
Gönderileri Kaydetme Formu
Formları ve bileşenleri yorumları oluştururken zaten açıklamıştık. Hala net değilse, form ve bileşen oluşturma bölümüne gidin, biz burada bekleyeceğiz ;)
Şimdi bu metodu EditPresenter
presenter'ına ekleyelim:
protected function createComponentPostForm(): Form
{
$form = new Form;
$form->addText('title', 'Başlık:')
->setRequired();
$form->addTextArea('content', 'İçerik:')
->setRequired();
$form->addSubmit('send', 'Kaydet ve yayınla');
$form->onSuccess[] = $this->postFormSucceeded(...);
return $form;
}
Formdan Yeni Gönderi Kaydetme
Formdan gelen verileri işleyecek metodu ekleyerek devam ediyoruz:
private function postFormSucceeded(array $data): void
{
$post = $this->database
->table('posts')
->insert($data);
$this->flashMessage("Gönderi başarıyla yayınlandı.", 'success');
$this->redirect('Post:show', $post->id);
}
Sadece hızlı bir özet: bu metot formdan verileri alır, veritabanına ekler, gönderinin başarılı bir şekilde kaydedildiği hakkında kullanıcıya bir mesaj oluşturur ve yeni gönderiyle sayfaya yönlendirir, böylece nasıl göründüğünü hemen görürüz.
Yeni Gönderi Oluşturma Sayfası
Şimdi Edit/create.latte
şablonunu oluşturalım:
{block content}
<h1>Yeni gönderi</h1>
{control postForm}
Her şey zaten açık olmalı. Son satır, henüz oluşturacağımız formu oluşturur.
Ayrıca karşılık gelen renderCreate
metodunu da oluşturabilirdik, ancak gerekli değil. Veritabanından
herhangi bir veri alıp şablona aktarmamız gerekmiyor, bu yüzden bu metot boş olurdu. Bu gibi durumlarda, metodun hiç var
olması gerekmez.
Gönderi Oluşturma Bağlantısı
Muhtemelen EditPresenter
ve onun create
eylemine nasıl bağlantı ekleyeceğinizi zaten
biliyorsunuzdur. Deneyin.
Sadece app/Presentation/Home/default.latte
dosyasına ekleyin:
<a n:href="Edit:create">Yeni gönderi yaz</a>
Gönderileri Düzenleme
Şimdi gönderiyi düzenleme seçeneğini de ekleyeceğiz. Çok basit olacak. Zaten postForm
formumuz hazır ve
onu düzenleme için de kullanabiliriz.
EditPresenter
presenter'ına yeni bir edit
sayfası ekleyeceğiz:
public function renderEdit(int $id): void
{
$post = $this->database
->table('posts')
->get($id);
if (!$post) {
$this->error('Gönderi bulunamadı');
}
$this->getComponent('postForm')
->setDefaults($post->toArray());
}
Ve başka bir şablon Edit/edit.latte
oluşturacağız:
{block content}
<h1>Gönderiyi düzenle</h1>
{control postForm}
Ve hem yeni bir makale ekleyebilecek (şimdi yaptığı gibi) hem de zaten var olan bir makaleyi düzenleyebilecek olan
postFormSucceeded
metodunu düzenleyeceğiz:
private function postFormSucceeded(array $data): void
{
$id = $this->getParameter('id');
if ($id) {
$post = $this->database
->table('posts')
->get($id);
$post->update($data);
} else {
$post = $this->database
->table('posts')
->insert($data);
}
$this->flashMessage('Gönderi başarıyla yayınlandı.', 'success');
$this->redirect('Post:show', $post->id);
}
Eğer id
parametresi mevcutsa, bu gönderiyi düzenleyeceğimiz anlamına gelir. Bu durumda, istenen gönderinin
gerçekten var olduğunu doğrularız ve eğer varsa, veritabanında güncelleriz. Eğer id
parametresi mevcut
değilse, bu yeni bir gönderinin eklenmesi gerektiği anlamına gelir.
Ancak bu id
parametresi nereden geliyor? Bu, renderEdit
metoduna eklenen parametredir.
Şimdi app/Presentation/Post/show.latte
şablonuna bir bağlantı ekleyebiliriz:
<a n:href="Edit:edit $post->id">Gönderiyi düzenle</a>
Özet
Blog şimdi işlevsel, ziyaretçiler aktif olarak yorum yapıyor ve artık yayınlamak için Adminer'a ihtiyacımız yok. Uygulama tamamen bağımsız ve herkes yeni bir gönderi ekleyebilir. Bir dakika, herkesin – ve gerçekten internet erişimi olan herkesi kastediyorum – yeni gönderiler ekleyebilmesi muhtemelen pek doğru değil. Yeni bir gönderiyi yalnızca giriş yapmış bir kullanıcının ekleyebilmesi için bir tür güvenlik önlemi gerekiyor. Buna bir sonraki bölümde bakacağız.