Proč má $wrapper nastavenou viditelnost jako private?
- Šaman
- Člen | 2668
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
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.