Görünümler (Views)

Görünümler sayfa içinde blok HTML oluşturmak için kullanılır. Örneğin ürün kartı, blog kartı, yan menü, navbar, footer... gibi.

Görünümler kontrolcülerden farklı olarak bir yaşam döngüsüne sahip değillerdir. Kontrolcüler, diğer görünümler ya da model sınıfları tarafından istenildiği zaman oluşturularak kullanılabilir. Burada dikkat edilmesi gereken görünümün bulunduğu temanın oluşturulmak istenen kod bloğu tarafından desteklenip desteklenmediği olacaktır.

Eğer görünümün çalıştırıldığı blok tema tarafından desteklenmiyorsa aşağıdaki kod bloğu ile render işlemi yapılabilir.

$html = CoreRenderer::getInstance()->renderView($view);

 

 

getTemplateFile() metodu ile belirtilen twig dosyası kullanılarak HTML render işlemi gerçekleştirilir. Burada belirtilen dosya ismi tema şablon dizini altında bulunan views dizininde aranır.
 
Src\Theme\View sınıfından türetilmelidir, Sınıfın sağladığı metodlar twig dosyası tarafından desteklenmelidir.
Örneğin ViewGroup görünümüne ait twig dosyası (Kernel/Src/BaseTheme/templates/views/view_group.twig) aşağıdaki gibidir.
ViewGroup görünümü içerisine başka görünümlerin eklenerek HTML olarak oluşturulmasını sağlayan bir görünümdür.
 
<{{ view.tag_name }} class='{{ view.classes|join(" ") }}' {{ view.renderAttributes()|raw }}>
{% for field in view.fields %}
    {{ field|raw }}
{% endfor %}
</{{ view.tag_name }}>
 
 
ViewGroup görünümüne ait Php kodu aşağıdaki gibidir.

<?php

namespace Src\Views;

use Src\Theme\View;

class ViewGroup extends View
{
    public $fields = [];
    public $tag_name;
    private bool $addClassToChildren = false;

    public function __construct(string $tag_name, string $wrapper_class)
    {
        $this->tag_name = $tag_name;
        $this->addClass($wrapper_class);
    }

    public static function create(string $tag_name, string $wrapper_class): ViewGroup
    {
        return new ViewGroup($tag_name, $wrapper_class);
    }

    public function getTemplateFile(): string
    {
        return "view_group.twig";
    }

    public function setTagName(string $tag_name): ViewGroup
    {
        $this->tag_name = $tag_name;
        return $this;
    }

    public function addClassToChildren(bool $addClassToChildren): ViewGroup
    {
        $this->addClassToChildren = $addClassToChildren;
        return $this;
    }

    public function addClass(string $class_name): ViewGroup
    {
        if (!$this->addClassToChildren) {
            parent::addClass($class_name);
        } else {
            foreach ($this->fields as &$field) {
                $field->addClass($class_name);
            }
        }
        return $this;
    }

    public function addField(View $field, $offset = 0)
    {
        if (!$offset) {
            $this->fields[] = $field;
        } else {
            array_splice($this->fields, $offset, 1, [$field, $this->fields[$offset]]);
        }
        return $this;
    }
}