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);
<{{ view.tag_name }} class='{{ view.classes|join(" ") }}' {{ view.renderAttributes()|raw }}>
{% for field in view.fields %}
{{ field|raw }}
{% endfor %}
</{{ view.tag_name }}>
<?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;
}
}