Bloga Etiketler Eklemek

Bloglara etiketler eklemek için Blog nesnesi ile N-N bağılmlı bir Blog Etiketleri(Tag) nesnesi yapmamız gerekiyor.
Bunun için tablolar ekranına gidiyoruz ve tag adında ve name kolonuna sahip bir tablo oluşturuyoruz.
Name kolonu için benzersiz ve boş değil seçeneklerini işaretliyoruz.


Tabloyu oluşturduktan sonra tabloyu sınıf olarak App\Entity\Tag sınıfına aktarıyoruz.
<?php

namespace App\Entity;

use CoreDB\Kernel\Model;
use CoreDB\Kernel\Database\DataType\ShortText;

/**
 * Object relation with table tag
 * @author mbakiyucel
 */

class Tag extends Model
{
    /**
    * @var ShortText $name
    * Etiket adı.
    */
    public ShortText $name;

    /**
     * @inheritdoc
     */
    public static function getTableName(): string
    {
        return "tag";
    }
}

Tag sınıfının varlık tanımını entity_config.yml dosyasında yapıyoruz. Varlık tanımı için buraya bakabilirsiniz.

tag:
  class: App\Entity\Tag

Blog sınıfı ve Tag sınıfı N-N ilişkili olacağı için bir bağlantı tablosu yapmamız gerekiyor. Tablolar ekranına gidip blogs_tags isminde bir bağlantı tablosu oluşturuyoruz. blogs_tags tablosu bir bağlantı tablosu olacağı için bu tabloyu sınıfa aktarmamıza ihtiyaç bulunmuyor. Ancak gerekli durumlarda aktarılabilir.
Sonrasında entity_config.yml dosyasında Blog sınıfı ve Tag sınıfı arasındaki N-N bağlantının bu tablo üzerinden olacağını tanımlıyoruz. Bağlantı çeşitleri için buraya bakabilirsiniz. Blog varlık tanımını aşağıdaki gibi değiştiriyoruz:

blog:
  class: App\Entity\Blog
  manyToMany:
    tag:
      mergeTable: blogs_tags
      selfKey: blog
      foreignKey: tag
      createIfNotExist: true

Yapılan bağlantı tanımı Blog nesnesi üzerinde $tag isminde ve CoreDB\Kernel\EntityReference sınıfında bir veri tipi oluşturacaktır. Bu veri tipinin tanımı yapılarak form üzerinde etiket girdisinin konumu ayarlanabilir. Bu girdinin Gövde girdisi altında olması için şu şekilde yerleştirelim:

<?php

namespace App\Entity;

use App\Controller\Admin\BlogController;
use CoreDB\Kernel\Model;
use CoreDB\Kernel\Database\DataType\ShortText;
use CoreDB\Kernel\Database\DataType\LongText;
use CoreDB\Kernel\Database\DataType\Checkbox;
use CoreDB\Kernel\Database\SelectQueryPreparerAbstract;
use CoreDB\Kernel\EntityReference;
use Src\Entity\Translation;
use Src\Views\Link;
use Src\Views\TextElement;

/**
 * Object relation with table blog
 * @author mbakiyucel
 */

class Blog extends Model
{
    /**
     * @var ShortText $title
     * Blog başlığı
     */
    public ShortText $title;
    /**
     * @var LongText $body
     * Blog içeriğinin HTML'i
     */
    public LongText $body;

    public EntityReference $tag;

    /**
     * @var Checkbox $published
     * Blog yayında mı?
     */
    public Checkbox $published;

    /**
     * @inheritdoc
     */
    public static function getTableName(): string
    {
        return "blog";
    }

    public function getResultHeaders(bool $translateLabel = true): array
    {
        $headers = parent::getResultHeaders($translateLabel);
        unset($headers["body"]);
        return $headers;
    }

    public function getResultQuery(): SelectQueryPreparerAbstract
    {
        return \CoreDB::database()->select(self::getTableName(), "b")
            ->select("b", [
                "ID as edit_actions", // edit_actions düzenleme ve silme butonları için gereklidir.
                "ID",
                "title",
                "published",
                "created_at",
                "last_updated"
            ]);
    }

    public function actions(): array
    {
        return [
            Link::create(
                BlogController::getUrl() . "add",
                TextElement::create(
                    "<span class='fa fa-plus'></span> " .
                    Translation::getTranslation("add_new_entity", [
                        Translation::getTranslation("blog")
                    ])
                )->setIsRaw(true)
            )->addClass("btn btn-sm btn-primary")
        ];
    }

    public function editUrl($value = null)
    {
        return BlogController::getUrl() . ($value ?: $this->ID);
    }
}


public EntityReference $tag; kısmının konumu bu girdinin konumunu belirleyen etmendir. Belirtilmediği takdirde formun en sonuna yerleşir.

En son durumda formun görünümü aşağıdaki gibi olacaktır:



Tag yazısının düzgün görünmesi için çeviri eklenebilir.

Blogları yönet ekranına gittiğimizde etiket aramasınında bu kısma eklendiğini görebilliriz. Ancak bu N-N bağlantılarda arama kısmının doğru çalışabilmesi için getResultQuery() metodunda ilgili tablonun sorguya eklenmiş olması gerekmektedir.
Bu yüzden bu metodu şu şekilde değiştiriyoruz: 

    public function getResultQuery(): SelectQueryPreparerAbstract
    {
        return \CoreDB::database()->select(self::getTableName(), "b")
            ->leftjoin("blogs_tags", "bt", "bt.blog = b.ID")
            ->leftjoin(Tag::getTableName(), "tag", "tag.ID = bt.tag")
            ->select("b", [
                "ID as edit_actions", // edit_actions düzenleme ve silme butonları için gereklidir.
                "ID",
                "title",
                "published",
                "created_at",
                "last_updated"
            ])->groupBy("b.ID");
    }

Sonrasında arama kısmının da doğru çalıştığını görebiliriz.