Screencast – kontaktný formulár: ‚contactForm‘ does not exist

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

Zdravým borci, mám tu menší problém s príkladom zo screencastu „kontaktný formulár“. Error ktorým mi tu svieti je: „Component with name ‚contactForm‘ does not exist.“. Vybehne to na riadku 16 v cache súbore:

15:            <div class="contact-form">
16:    <?php $_ctrl = $control->getWidget("contactForm"); if ($_ctrl instanceof Nette\Application\UI\IPartiallyRenderable) $_ctrl->validateControl(); $_ctrl->render() ?>
17:            </div><?php

V template mám:

{block content}


	<h2>Contact page</h2>

        <div class="contact-form">
            {control contactForm}
        </div>

Definícia formuláru tak ako v screencaste je v zvlášť súbore aj adresári:

<?php

use Nette\Application\UI\Form,
 Nette\Forms\Form;

class ContactForm extends Form {

    public function __construct(Nette\IComponentContainer $parent = NULL, $name = NULL) {
        parent::__construct($parent,$name);

        $this->buildForm();
    }


    protected function buildForm(){
        $this->addText('name', 'Vaše meno')
                ->addRule(Form::FILLED,'Vyplňte Vaše meno');

        $this->addText('email', 'Váš email')
                ->addRule(Form::FILLED, 'Vyplňte Váš email')
                ->addRule(Form::EMAIL, 'Zadajte korektný email');

        $this->addTextArea('message', 'Správa')
                ->addRule(Form::FILLED, 'Vyplnte pole %label');

        $this->addSubmit('ok', 'Odoslať');
    }

}

?>

A ešte tu je presenter:

<?php

class HomepagePresenter extends BasePresenter
{

    public function renderDefault()
    {
            $this->template->anyVariable = 'any value';
    }

    protected function createComponentCotactForm($name)
    {
        return new ContactForm($this, $name);
    }
}
?>

Snáď si nespravím úplnú hanbu, ak to bude nejaký banálny preklep :). Teraz ma napadá taká otázka, v screencaste je ContactForm vo zvlášť súbore a myslím že nikde nieje includnutý. Ono si ho nette nájde vďaka robotLoaderu?

22
Člen | 1478
+
0
-

chybí ti tady n

protected function createComponentCotactForm($name
vvoody
Člen | 910
+
0
-

:D to som si mohol myslieť, nabudúce si dám väčší pozor. Síce mi vybehol ďalší error ale s tým vás budem otravovať až s ním aspoň pol dňa nepohnem.

bojovyletoun
Člen | 667
+
0
-

use Nette\Application\UI\Form, Nette\Forms\Form; – tohle nemůže fungovat… → to druhé umaž

Ještě jedna věc – tvoříš li komponentu přes return, pak jsou argumenty $this a name zbytečné: uprav na toto:
function createComponentCo*n*tactForm($name){return new ContactForm($this, $name);}
 function createComponentCo*n*tactForm(){return new ContactForm;}

Editoval bojovyletoun (8. 6. 2011 19:51)

vvoody
Člen | 910
+
0
-

Ten namespace to viem :) tam som pôvodne hľadal tú chybu, lebo s aktuálnou verziou Nette mi našepkávač pliginu do NB (geniálna vec – ďakujem borcom že ho vytvorili) tie ktoré boli v screencaste proste nenašepkal, tak som išiel pokus omyl, až keď som si opravil ten preklep tak som sa zorientoval v Nette API a našiel tie správne.

Btw, tie odlišnosti vo verzii zo screencastu a aktuálnej verzii by bolo fajne uviesť pred to video aby nový nádejný Nette-useri neboli z toho hneď zo začiatku taký vypatlaný ako ja. Kľudne si to prebehnem celé od znovu a spíšem tie odlišnosti, napríklad formou: čas vo videu ⇒ súbor ⇒ číslo riadka ⇒ pôvodný zápis ⇒ nový zápis + nejaký obkec. Predpokladám že autor screencastu sa ho nebude chcieť prerábať, tak aspoň takéto upozornenie nech sú začiatočníci ako ja pripravený.

Tie parametre: opísal som to tak zo screencastu a nieje mi veľmi jasný ich význam. Môžes popísať nejaký príklad kedy tie parametre majú význam?

newPOPE
Člen | 648
+
0
-

Ahoj,

@vvoody nie ze by sa mi nechcelo to opravit :-) (ano je tu problem so zmenami verzii, API atd…), no nestiham vsetky zmeny sledovat (ale 20teho statnice a potom hura hokej :-)) cize neviem co sa menilo a co nie a ako to urobit po novom. Samozrejme by som bol rad keby ludia ktori si zmeny vsimaju to bud opravili aspon v dokumentacii (zas taky problem to nie je) popr. sa mozu ozvat na forum ku kazdemu scrcastu je vlakno a predpokladam ze autor konkretneho scrcastu by to do dokumentacie zapracoval. S tym, ze by aktualne kody boli napr na githube.

vvoody
Člen | 910
+
0
-

Pardon, presne tak som to myslel, určite nie že by si bol lenivý :)
Pre moje ujasnenie pojmov, dokumentáciu rozumejme konkrétne všetko pod https://doc.nette.org/cs/ alebo niečo špecifickejšie? Tie zmeny teda spíšem do toho vlákna.

vvoody
Člen | 910
+
0
-

Chvíľu som zápasil (úspešne) s neon configom. Zapísal som si do neho mail a subject tak ako tomu je v screencaste kde si to zapísal do ini configu. Mňa by zaujímalo ako by sa malo pristupovať k údajom v neon configu. Mne sa to podarilo nasledovne:
config

common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes
		# default_charset: "UTF-8"

	services:
		authenticator:
			class: UsersModel

		robotLoader:
			run: true
	mail:
		to: "moj@mail.sk"
		subject: "Kontaktný formulár"

kúsok prezenteru:

<?php
    protected function sendContactEmail($values)
    {
        $mail = new Nette\Mail\Message;

        //$mailCOnfig = Nette\Environment::getConfig('mail');
	$mailConfig = Nette\Config\NeonAdapter::load(APP_DIR . '\config.neon');

        $mail->setFrom($values['email']);
        $mail->addTo($mailConfig['common']['mail']['to']);
        $mail->setSubject($mailConfig['common']['mail']['subject']);

        $mail->setBody($values['message']);

        $mail->send();

        $this->flashMessage('Správa bola odoslaná');

        $this->redirect('this');
    }
?>

Je to správny spôsob alebo existuje nejaký slušnejší?

_Martin_
Generous Backer | 679
+
0
-

Bylo by lepší, pokud bys závislosti dodal z venku – tj. ono Dependency Injection.

vvoody
Člen | 910
+
0
-

_Martin_ napsal(a):

Bylo by lepší, pokud bys závislosti dodal z venku – tj. ono Dependency Injection.

Z vonku triedy alebo stačí z vonku funkcie? Nie som si celkom istý či ono DI znamená injectovanie len do tried (presnejšie asi do ich inštancií) alebo sa dá považovať za DI aj keď si len bokom (pod tou istou triedou) spravím o funkciu viac?

<?php

    public function contactFromOkClicked(\Nette\Forms\Controls\SubmitButton $button)
    {
        $values = $button->getForm()->getValues();
        $mailConfig = $this->getMailConfig();
        $this->sendContactEmail($values,$mailConfig);
    }

    protected function sendContactEmail($values,$mailConfig)
    {
        $mail = new Nette\Mail\Message;

        $mail->setFrom($values['email']);
        $mail->addTo($mailConfig['to']);
        $mail->setSubject($mailConfig['subject']);
        $mail->setBody($values['message']);

        $mail->send();

        $this->flashMessage('Správa bola odoslaná');

        $this->redirect('this');
    }

    private function getMailConfig()
    {
	$config = Nette\Config\NeonAdapter::load(APP_DIR . '\config.neon');
	return $config['common']['mail'];
    }

}
?>

A musím sa ešte raz spýtať či nieje iný spôsob zistenia obsahu configu, lebo load(APP_DIR . ‚\config.neon‘); mi príde úplne divné kedže ten config už musel byť načítaný tak prečo ho načítavať znova, nieje už niekde uložený v nejakom poly?

Druhá otázka, patrí vôbec ten mail/subject do toho configu? Nedať ho radšej niekam inam?

Viem riešim skoro až nezmyselné drobnosti ale keď už zrevidovať ten screencast tak poriadne :) aby nováčikovia ako ja nezískali zlé návyky.