Nella/Phone input nelze zakomponovat do formuláře

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

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
+
+1
-

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
+
0
-

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
+
0
-

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)

Patrik Votoček
Člen | 2221
+
+1
-

Opraveno