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).

versiyon: 3.x