Formlar

Formlar görünümlerden türeyen bir yapıdır. Ancak kendi içinde CSRF token kontrolü gibi genişletilmiş özellikleri vardır.

Yeni bir form oluşturmak için oluşturulan form sınıfının \Src\Form\Form sınıfından türetilmesi gerekmektedir.

Bu sınıf soyut bir sınıftır ve aşağıdaki 3 metodun sınıf içinde tanımlanması gerekmektedir.

abstract public function getFormId(): string; Formun özel kimliğini belirten bir string gönderilmelidir. CSRF jetonu için
abstract public function validate(): bool; Form gönderildiğinde gelen değerlerin doğruluğu burada kontrol edilmelidir.
abstract public function submit(); Form kontrolleri doğru olduğunda yapılacak işlem burada tanımanmalıdır.

Şifremi unuttum formuna ait php kodu aşağıdaki gibidir. Formun yapıcı metodunda form girdi alanları tanımları FormWidget görünümünden türeyen sınıflar kullanılarak yapılmalıdır.
FormWidget sınıfı da bir görünümdür. yeni FormWidget tanımları App\ isim uzayı altında yapılabilir.

<?php

namespace Src\Form;

use CoreDB\Kernel\Messenger;
use Src\Entity\ResetPassword;
use Src\Entity\Translation;
use Src\Entity\User;
use Src\Form\Widget\InputWidget;

class ForgetPasswordForm extends Form
{
public string $method = "POST";

public function __construct()
{
parent::__construct();
$this->addClass("user");
$this->addField(
InputWidget::create("email")
->setType("email")
->setLabel(Translation::getTranslation("email"))
->addClass("form-control-user")
->addAttribute("placeholder", Translation::getTranslation("email"))
->addAttribute("required", "true")
);
}
public function getFormId(): string
{
return "forget_password_form";
}

public function getTemplateFile(): string
{
return "forget-password-form.twig";
}

public function validate(): bool
{
if (isset($this->request["reset"])) {
if (!User::getUserByEmail($this->request["email"])) {
$this->setError("username", Translation::getTranslation("wrong_email"));
}
}
return empty($this->errors);
}

public function submit()
{
/** @var User */
$user = User::getUserByEmail($this->request["email"]);
$reset_password = new ResetPassword();
$reset_password = ResetPassword::get(["user" => $user->ID]);
if (!$reset_password) {
$reset_password = new ResetPassword();
$reset_password->user->setValue($user->ID);
$reset_password->key->setValue(hash("SHA256", \CoreDB::currentDate() . json_encode($user->ID)));
$reset_password->save();
}
$reset_link = BASE_URL . "/reset_password/?USER=" . $user->ID . "&KEY=" . $reset_password->key;
$message = Translation::getEmailTranslation("password_reset", [$reset_link, $reset_link]);
$username = $user->getFullName();
\CoreDB::HTMLMail($user->email, Translation::getTranslation("reset_password"), $message, $username);
\CoreDB::messenger()
->createMessage(
Translation::getTranslation("password_reset_mail_success"),
Messenger::SUCCESS
);
}
}



forget-password-form.twig dosyası aşağıdaki gibidir:

{% extends "forms/form.twig" %}

{% block fields %}
{{ form.fields["form_id"] }}
{{ form.fields["form_build_id"] }}
{{ form.fields["form_token"] }}
<div class="form-group">
{{ form.fields["email"] }}
</div>
<div class="form-group">
<input type="submit" class="btn btn-info btn-user btn-block" value="{{ t("reset") }}" name="reset">
</div>
<div class="text-center">
<a class="small" href="{{ constant("BASE_URL") ~ "/login" }}">
{{ t("login") }}</a>
</div>
{% endblock %}