Ağaç Form

Ağaç Form (Src\Form\TreeForm) nesnelerin sıralanabilir, iç içe geçebilir şekilde olmasını sağlayan yapıyı gerçekler.

TreeForm kullanılacak sınıf ismi belirtilerek oluşturulabilir. TreeForm oluşturulurken kullanılacak nesnenin Src\Entity\TreeEntityAbstract soyut sınıfından türemiş olması gereklidir.

Bu soyut sınıfın kodu aşağıdaki gibidir.

<?php

namespace Src\Entity;

use CoreDB\Kernel\Database\DataType\Integer;
use CoreDB\Kernel\Model;
use Exception;

abstract class TreeEntityAbstract extends Model
{
    public Integer $weight;

    abstract public static function getTreeFieldName(): string;

    abstract public function getRemoveServiceUrl(): string;

    public static function getRootElements(): array
    {
        if (static::hasSubItems()) {
            return static::findAll(["parent" => null], static::getTableName(), "weight");
        } else {
            return static::findAll([], static::getTableName(), "weight");
        }
    }

    public static function hasSubItems()
    {
        return true;
    }

    public function getSubNodes(): array
    {
        return static::findAll(["parent" => $this->ID], static::getTableName(), "weight");
    }

    public function delete(): bool
    {
        try {
            if ($this->hasSubItems()) {
                foreach ($this->getSubNodes() as $subNode) {
                    $subNode->delete();
                }
            }
            return parent::delete();
        } catch (Exception $ex) {
            return false;
        }
    }
}
 

 

getTreeFieldName() metodu sıralama formunda kullanıcıya gösterilecek olan ayırt edici ismin bulunduğu kolon ismini çevirmelidir.

getRemoveServiceUrl() sil butonuna basıldığında gönderilecek olan nodeId parametresini kullanarak silme işlemini yapan servis olmalıdır.

Örnek bir silme servisi şu şekilde olabilir:

    public function removeDocument()
    {
        $document = Document::get(@$_POST["nodeId"]);
        if ($document) {
            $document->delete();
            $this->createMessage(Translation::getTranslation("record_removed"), Messenger::SUCCESS);
        }
    }



hasSubItems() metodu sınıfın alt üst ilişkisi bulunmuyorsa false çevirmelidir. 

Eğer sınıfta alt üst ilişkisi bulunuyorsa Model'in delete() metodu ezilerek alt nesneler de silinmeli ya da alt nesneler silinen sınıfın üstüne taşınmalıdır.

Model içinde silme metodunu ezme örneği şu şekildedir:

    public function delete(): bool
    {
        try {
            if ($this->hasSubItems()) {
                foreach ($this->getSubNodes() as $subNode) {
                    $subNode->delete();
                }
            }
            return parent::delete();
        } catch (Exception $ex) {
            return false;
        }
    }

Sınıfta sadece sıralama özelliği bulunuyorsa "weight" (tam sayı) kolonu, alt üst ilişkiside bulunuyorsa "parent" (tablo referansı - kendisine) kolonunun bulunması zorunludur.