Bileşen Modeli
Nette önemli bir kavram da bileşendir. Sayfalara görsel
etkileşimli bileşenler ekleriz, formlar veya tüm öğeleri de bileşenlerdir. Tüm bu bileşenlerin miras aldığı,
nette/component-model
paketinin bir parçası olan ve bileşen ağacı hiyerarşisini oluşturmaktan sorumlu olan iki
temel sınıf vardır.
Component
Nette\ComponentModel\Component tüm
bileşenlerin ortak atasıdır. Bileşenin adını döndüren getName()
yöntemini ve ebeveynini döndüren
getParent()
yöntemini içerir. Her ikisi de setParent()
yöntemiyle ayarlanabilir – ilk parametre
ebeveyn, ikincisi ise bileşen adıdır.
lookup(string $type): ?Component
İstenen sınıf veya arayüzün bir nesnesi için hiyerarşide arama yapar. Örneğin,
$component->lookup(Nette\Application\UI\Presenter::class)
, birkaç seviyeye rağmen bileşen kendisine bağlıysa
presenter öğesini döndürür.
lookupPath(string $type): ?string
Geçerli bileşen ile aranan bileşen arasındaki yoldaki tüm bileşenlerin adlarının birleştirilmesiyle oluşturulan bir
dize olan sözde yolu döndürür. Örneğin, $component->lookupPath(Nette\Application\UI\Presenter::class)
, sunum
yapan kişiye göre bileşenin benzersiz tanımlayıcısını döndürür.
Container
Nette\ComponentModel\Container ana
bileşendir, yani çocukları içeren ve böylece ağaç yapısını oluşturan bileşendir. Bileşenleri kolayca eklemek, almak
ve kaldırmak için yöntemleri vardır. Örneğin formun veya Control
ve Presenter
sınıflarının
atasıdır.
getComponent(string $name): ?Component
Bir bileşen döndürür. Tanımsız alt öğeyi çağırma girişimi, createComponent($name)
fabrikasının çağrılmasına neden olur. Yöntem createComponent($name)
yöntemi çağırır
createComponent<component name>
ve bileşenin adını bir parametre olarak geçirir. Oluşturulan bileşen daha
sonra mevcut bileşene çocuğu olarak aktarılır. Bunlara bileşen fabrikaları diyoruz, Container
adresinden miras
alınan sınıflarda uygulanabilirler.
getComponents(): array
Doğrudan torunları bir dizi olarak döndürür. Anahtarlar bu bileşenlerin adlarını içerir. Not: 3.0.x sürümünde, yöntem bir dizi yerine bir yineleyici döndürüyordu ve ilk parametresi bileşenler arasında derinlemesine yineleme yapılıp yapılmayacağını belirtiyordu, ikincisi ise bir tür filtresini temsil ediyordu. Bu parametreler kullanımdan kaldırılmıştır.
getComponentTree(): array
İç içe geçmiş tüm alt bileşenler de dahil olmak üzere tüm bileşen hiyerarşisini dizinlenmiş dizi olarak döndürür. Arama önce derinlemesine yapılır.
Ataların İzlenmesi
Nette bileşen modeli çok dinamik ağaç çalışmasına izin verir (bileşenleri kaldırabilir, taşıyabilir, ekleyebiliriz), bu nedenle bir bileşen oluşturduktan sonra ebeveynin, ebeveynin ebeveyninin vb. hemen (yapıcıda) bilindiği gerçeğine güvenmek hata olur. Genellikle bileşen oluşturulduğunda ebeveyn hiç bilinmez.
Bir bileşenin sunum ağacına ne zaman eklendiğini nasıl öğrenebilirim? Ebeveyn değişikliğini takip etmek yeterli
değildir, çünkü örneğin ebeveynin ebeveyni sunum yapan kişiye eklenmiş olabilir. monitor($type, $attached,
$detached) yöntemi yardımcı olabilir. Her bileşen istediği sayıda sınıfı ve arayüzü izleyebilir. Bağlantı veya
bağlantının kesilmesi, sırasıyla $attached
ve $detached
geri çağrılarının çağrılması ve
izlenen sınıfın nesnesinin aktarılmasıyla bildirilir.
Bir örnek: Nette Forms'ta dosya yüklemek için form öğesini temsil eden UploadControl
sınıfı, formun
enctype
özniteliğini multipart/form-data
değerine ayarlamalıdır. Ancak nesnenin oluşturulması
sırasında herhangi bir forma eklenmesi gerekmez. Form ne zaman değiştirilir? Çözüm basittir – yapıcıda izleme için
bir istek oluştururuz:
class UploadControl extends Nette\Forms\Controls\BaseControl
{
public function __construct($label)
{
$this->monitor(Nette\Forms\Form::class, function ($form): void {
$form->setHtmlAttribute('enctype', 'multipart/form-data');
});
// ...
}
// ...
}
ve form kullanılabilir olduğunda, geri arama çağrılır. (Önceden bunun yerine attached
ve
detached
ortak yöntemleri kullanılıyordu).