Nella/Phone input nelze zakomponovat do formuláře
- Azathoth
- Člen | 495
Zdravím,
mám problém s addonem https://componette.org/search/?…. Chci jej zakomponovat do stránek, které právě tvořím, ale bohužel se mi nedaří addon zprovoznit.
Zde je má třída PhoneNumberForm:
<?php
class PhoneNumberForm extends UI\Form {
public function __construct(IContainer $parent = NULL, $name = NULL)
{
parent::__construct($parent, $name);
$this->addComponent(new \Nella\Forms\Controls\PhoneNumber('Phone'), 'phone');
$this->addSubmit('send', 'Submit');
}
}
?>
a zde je presenter, ve kterém formulář vytvářím:
<?php
class HomepagePresenter extends BasePresenter {
public function renderDefault() {
}
public function createComponentPhoneNumberForm() {
$form = new PhoneNumberForm();
$form['phone']
->addCondition(\Nette\Application\UI\Form::FILLED)
->addRule([$form['phone'], 'validatePhoneNumber'], 'Phone number is invalid');
$form->onSuccess[] = $this->phoneNumberFormSucceeded;
return $form;
}
public function phoneNumberFormSucceeded($form) {
$values = $form->getValues();
try{
$this->flashMessage('You successfully completed form.');
$this->redirect('Homepage:'); //přesměruje na homepage
} catch (Nette\Security\AuthenticationException $e) { //chytá výjimku, kterou vyhazuje neúspěšný pokus o přidání uživatele
$form->addError($e->getMessage());
}
}
}
?>
A zde je template, kde má být formulář:
<?php
{block content}
<h1 n:block=title>{_texts.homepage.title}</h1>
<div>
<div>
{_texts.homepage.text}
</div>
{control phoneNumberForm}
</div>
{/block}
?>
A můj problém je v tom, že Tracy hlásí Fatal error: Cannot access property Nella\Forms\Controls\PhoneNumber::$phonePrefixes
File: …\vendor\nella\forms-phone\src\Nella\Forms\Controls\PhoneNumberInput.php:395
385: * @param string 386: * @return \Nette\Utils\Html 387: * @throws \Nette\InvalidArgumentException 388: */ 389: public function getControlPart($key) 390: { 391: $name = $this->getHtmlName(); 392: 393: if ($key === static::NAME_PREFIX) { 394: $control = \Nette\Forms\Helpers::createSelectBox( 395: array_combine(static::$phonePrefixes, static::$phonePrefixes), 396: array( 397: ‚selected?‘ ⇒ $this->prefix, 398: ) 399: );
Ocením každou radu.
Editoval Azathoth (11. 8. 2014 21:05)
- David Kudera
- Člen | 455
Zkus použít jen třídu PhoneNumberInput. PhoneNumber je deprecated .
Jo a ten konstruktor zkrátit takhle:
public function __construct()
{
parent::__construct();
// ...
}
čili odstranit parent a name. Není to doporučované a nemělo by se to používat ;-)
Editoval David Kudera (11. 8. 2014 21:11)
- Azathoth
- Člen | 495
Děkuji moc, teď to krásně funguje. Kámen úrazu byl opravdu v té deprecated třídě. Mohl bych poprosit autora, aby to změnil v té své ukázce na stránce https://componette.org/search/?… ?
A mám ještě jednu otázku: proč není doporučované mít v konstruktoru parent a name, když v https://doc.nette.org/cs/forms#… je to ukázáno jako příklad toho, jak dělat vlastní formuláře?
- David Kudera
- Člen | 455
viz třeba pár prvních odkazů
ale jinak třeba i jen kvůli praktičnosti. Je to psaní navíc, navíc Nette si tohle pořeší samo (jen o něco později a parent je dostupný až v metodě attached a ne hned v konstruktoru). Další věcí by mohla být i třeba komplikace formulářů jako komponent (ne jen formulářů, ale všech komponent registrovaných v di).
Jednoduše je to zbytečné a pokud je potřeba parent (nejčastěji nejspíš presenter), tak stačí použít attached, jako je vysvětleno tady ;-)
Edit: snad to hlavní jsem zapomněl, ale souvisí to např. s komponentami v di. Zaplníš si konstruktor a pokud ta komponenta čeká nějaké služby, tak ten konstruktor bude dost narůstat
Editoval David Kudera (11. 8. 2014 23:13)