Bileşen Modeli

Nette'de önemli bir kavram 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ığı temel iki sınıf, nette/component-model paketinin bir parçasıdır ve bileşenlerin ağaç hiyerarşisini oluşturmaktan sorumludur.

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 bileşenin adıdır.

lookup (string $type): ?Component

Hiyerarşide yukarı doğru istenen sınıf veya arayüzün nesnesini arar. Örneğin, $component->lookup(Nette\Application\UI\Presenter::class), bileşen ona birkaç seviye üzerinden bile bağlıysa presenter'ı döndürür.

lookupPath (string $type): ?string

Yol adı verilen, geçerli ve aranan bileşen arasındaki yoldaki tüm bileşenlerin adlarının birleştirilmesiyle oluşan bir dize döndürür. Yani, örneğin $component->lookupPath(Nette\Application\UI\Presenter::class), bileşenin presenter'a göre benzersiz tanımlayıcısını döndürür.

Container

Nette\ComponentModel\Container, ebeveyn bileşendir, yani alt öğeleri içeren ve böylece bir ağaç yapısı oluşturan bir bileşendir. Nesneleri kolayca eklemek, almak ve kaldırmak için yöntemlere sahiptir. Örneğin formun veya Control ve Presenter sınıflarının atasıdır.

getComponent (string $name): ?Component

Bileşeni döndürür. Tanımlanmamış bir alt öğeyi almaya çalışırken, createComponent($name) fabrikası çağrılır. createComponent($name) yöntemi, geçerli bileşende createComponent<bileşen adı> yöntemini çağırır ve parametre olarak bileşenin adını geçirir. Oluşturulan bileşen daha sonra geçerli bileşene alt öğesi olarak eklenir. Bu yöntemlere bileşen fabrikaları diyoruz ve Container sınıfının alt sınıfları tarafından uygulanabilirler.

getComponents(): array

Doğrudan alt öğeleri 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şenlerin derinlemesine taranıp taranmayacağını belirtiyordu ve ikincisi bir tür filtresi temsil ediyordu. Bu parametreler kullanımdan kaldırılmıştır.

getComponentTree(): array

Tüm iç içe geçmiş alt bileşenler dahil olmak üzere tüm bileşen hiyerarşisini dizinlenmiş bir dizi olarak alır. Arama önce derinlemesine yapılır.

Ataları İzleme

Nette bileşen modeli, ağaçla çok dinamik çalışmaya olanak tanır (bileşenleri kaldırabilir, taşıyabilir, ekleyebiliriz), bu nedenle bir bileşen oluşturulduktan sonra ebeveynin, ebeveynin ebeveyninin vb. hemen (kurucuda) bilindiğine güvenmek bir hata olur. Çoğu zaman, ebeveyn oluşturma sırasında hiç bilinmez.

Bir bileşenin presenter ağacına ne zaman bağlandığını nasıl anlarız? Ebeveyn değişikliğini izlemek yeterli değildir, çünkü örneğin ebeveynin ebeveyni presenter'a bağlanmış olabilir. monitor($type, $attached, $detached) yöntemi yardımcı olur. Her bileşen, herhangi bir sayıda sınıfı ve arayüzü izleyebilir. Bağlanma veya ayrılma, $attached veya $detached geri çağrısının çağrılmasıyla ve izlenen sınıfın nesnesinin geçirilmesiyle bildirilir.

Daha iyi anlamak için bir örnek: Nette Forms'daki dosya yükleme form öğesini temsil eden UploadControl sınıfı, formun enctype niteliğini multipart/form-data değerine ayarlamalıdır. Ancak nesne oluşturulduğunda herhangi bir forma bağlı olmayabilir. Öyleyse formu hangi noktada değiştirmeli? Çözüm basittir – kurucuda izleme istenir:

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 çağrı çağrılır. (Daha önce bunun yerine ortak attached veya detached yöntemi kullanılıyordu).

versiyon: 3.x