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:

  1. Ana sayfaya “Yeni gönderi yaz” bağlantısını ekleyin.
  2. 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.
  3. 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?

  1. Gönderi eklemek için bir form içeren yeni bir presenter oluşturun.
  2. Form başarıyla gönderildikten sonra çalışacak ve yeni gönderiyi veritabanına kaydedecek bir geri arama tanımlayın.
  3. Bu formun olacağı yeni bir şablon oluşturun.
  4. 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.