Proč má $wrapper nastavenou viditelnost jako private?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Šaman
Člen | 2668
+
0
-

Ahoj, snažím se upravit checkbox tak, aby se renderoval jako běžný input (samostatně label a pak zaškrtítko).
Vytvořil jsem si vlastní třídu a v ní přepsal metody, které za toto chování mohou:

<?php
namespace App\Utils;
use Nette\Forms\Controls\Checkbox as NetteCheckbox;

class Checkbox extends NetteCheckbox
{
	/**
	 * Generates control's HTML element.
	 * @return \Nette\Utils\Html
	 */
	public function getControl()
	{
		return $this->wrapper->setHtml($this->getControlPart());
	}

	/**
	 * Generates label's HTML element.
	 * @param  string
	 * @return \Nette\Utils\Html|string
	 */
	public function getLabel($caption = NULL)
	{
		return $this->getLabelPart();
	}
}
?>

Ale $wrapper je v Nette checkboxu nastavený jako private, takže musím duplikovat celý kód checkboxu. Nebylo by lepší používat viditelnost protected všude, kde to není bezpečnostní riziko?


A propo je nějaké lepší místo kde přidat addNěco() metodu formuláře, než do bootstrapu?

<?php
Nette\Object::extensionMethod('Nette\Forms\Container::addAppCheckbox', function($form, $name, $label = NULL){
	return $form[$name] = new App\Utils\Checkbox($label);
});
?>
Majkl578
Moderator | 1364
+
+3
-

Public a protected vlastnosti/metody se standardně stávají veřejným API třídy a to je ne vždy žádoucí, často je – pokud je potřeba vystavit rozhraní – vhodnější udělat to pomocí getteru nebo konkrétních metod umožňujících konkrétní manipulaci. Ostatně v tomhle případě getter existuje, jmenuje se Nette\Forms\Controls\Checkbox::getSeparatorPrototype().


A propo je nějaké lepší místo kde přidat addNěco() metodu formuláře, než do bootstrapu?

Třeba do initialize() DI kontejneru. Ale ideálně nepoužívat vlastní add* metody vůbec.

Šaman
Člen | 2668
+
0
-

Díky, getter jsem hledal, ale ne pod tímhle názvem.

Editoval Šaman (23. 2. 2016 5:24)