Screencast – kontaktný formulár: ‚contactForm‘ does not exist
- vvoody
- Člen | 910
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?
- bojovyletoun
- Člen | 667
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
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
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
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
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ší?
- vvoody
- Člen | 910
_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.