Formulář nic nedělá
- tomaass
- Člen | 74
Dobrý den,
pracuji s třídou AppForm v architektuře MVC. Zkopíroval jsem kód,
který je v Průvodci
programátora (konkrétně „Obsluha událostí“), abych rozchodil
základní formulář v Nette. Bohužel mi to nefunguje. Jednak dostávám na
obrazovce Warning: Method handlemyForm-submit does not
exist in C:\......\libs\Nette\Application\Link.php on line 121. a jednak
po odsouhlasení, nebo cancelnutí formuláře se nezavolá žádná
připravená metoda. Všechno mám do jisté míry standartní.
Nevím, kde je chyba. Už jí hledám dlouho.
Mohl by mi někdo pomoci, nebo alespoň nastínit řešení? Děkuji
- Honza Kuchař
- Člen | 1662
Bohužel nenapadá mě, kde by mohla být chyba.
//EDIT: Zkus napsat více info.
Editoval honzakuchar (28. 10. 2009 22:14)
- tomaass
- Člen | 74
Kód:
<?php
class DefaultPresenter extends /*Nette\Application\*/BasePresenter
{
public function renderDefault()
{
$this->template->form = $this['myForm'];
}
// obslužné handlery:
public function okClicked(SubmitButton $button)
{
// submitted and valid
Debug::dump($button->getForm()->getValues());
die('a');
$this->redirect('a');
}
public function cancelClicked(SubmitButton $button)
{
// process cancelled
die('b');
$this->redirect('b');
}
public function formSubmitted(AppForm $form)
{
// manual processing
if (!$form['cancel']->isSubmittedBy()) { die('c'); }
}
protected function createComponentMyForm()
{
$form = new AppForm;
$form->addText('name', 'Your name:');
$form->addSubmit('ok', 'Send')
->onClick[] = array($this, 'okClicked');
$form->addSubmit('cancel', 'Cancel')
->setValidationScope(FALSE) // prvek se nebude validovat
->onClick[] = array($this, 'cancelClicked');
// alternativa:
$form->onSubmit[] = array($this, 'formSubmitted');
return $form;
}
public function renderAhoj()
{
$this->renderDefault();
}
public function renderVlozitAuto()
{
$this->template->formular = $this['myForm'];
}
}
?>
Formulář se zobrazí, a ještě před ním:
Warning:* Method handlemyForm-submit does not exist in
C:\programovani\WWW-PHP\zakazka3 – kozak
web\pokusy\Pokus-nette\libs\Nette\Application\Link.php on line 121*
Bohužel na nic nereaguje. Nikdy se zadna obsluzna procedura nezavola.
- tomaass
- Člen | 74
nefunguje ani:
<?php
$form = new AppForm;
$form->addText('name', 'Your name:');
$form->addSubmit('ok', 'Send')
->onClick[] = array($this, 'okClicked');
$form->addSubmit('cancel', 'Cancel')
->setValidationScope(FALSE) // prvek se nebude validovat
->onClick[] = array($this, 'cancelClicked');
// alternativa:
//$form->onSubmit[] = array($this, 'formSubmitted');
?>
ani
<?php
$form = new AppForm;
$form->addText('name', 'Your name:');
$form->addSubmit('ok', 'Send');
//->onClick[] = array($this, 'okClicked');
$form->addSubmit('cancel', 'Cancel')
->setValidationScope(FALSE); // prvek se nebude validovat
//->onClick[] = array($this, 'cancelClicked');
// alternativa:
$form->onSubmit[] = array($this, 'formSubmitted');
?>
- Tomik
- Nette Evangelist | 485
Viděl bych to na chybu někde jinde, mě výše uvedený kód funguje naprosto bez problémů.
Ještě bych zkusil zakomentovat řádek
$this->template->form = $this['myForm'];
a vypisovat
formulář pomocí {control myForm}
.
Poslední co mě napadá: jaká je verze PHP, jaká je verze Nette?
Případně zda je možné poskytnout výpis Laděnky (tj. tu chybu
Warning Method handlemyForm-submit does not ...
nechat vypsat
pomocí Nette\Debug – https://tracy.nette.org/cs/), a
případně phpinfo();
.
- tomaass
- Člen | 74
A jsme doma…
Funguje bez BasePresenteru.
Zde je kód:
<?php
class BasePresenter extends /*Nette\Application\*/Presenter
{
public function templatePrepareFilters($template)
{
$template->registerFilter(new CurlyBracketsFilter);
}
//---------------------------------------------------------------------------
//-- Secure Behaviour -------------------------------------------------------
//---------------------------------------------------------------------------
/**
* For @secure annotated signal handler methods checks if URL parameters has not been changed
* @param string $signal
* @throws BadSignalException
*/
public function signalReceived($signal) {
$methodName = $this->formatSignalMethod($signal);
if (method_exists($this, $methodName)) {
$method = $this->getReflection()->getMethod($methodName);
if (Annotations::has($method, 'secured')) {
$protectedParams = array();
foreach ($method->getParameters() as $param) {
$protectedParams[$param->name] = $this->getParam($param->name);
}
if ($this->getParam('__secu') !== $this->createSecureHash($protectedParams)) {
throw new BadSignalException('Secured parameters are not valid.');
}
}
}
parent::signalReceived($signal);
}
/**
* Generates link. If links points to @secure annotated signal handler method, additonal
* parameter preventing changing parameters will be added.
*
* @param string $destination
* @param array|mixed $args
* @return string
*/
public function link($destination, $args = array()) {
if (!is_array($args)) {
$args = func_get_args();
array_shift($args);
}
$link = parent::link($destination, $args);
$lastrequest = $this->presenter->lastCreatedRequest;
/* --- Bad link --- */
if ($lastrequest === NULL) {
return $link;
}
/* --- Not a signal --- */
if (substr($destination, - 1) !== '!') {
return $link;
}
/* --- Only on same presenter --- */
if ($this->getPresenter()->getName() !== $lastrequest->getPresenterName()) {
return $link;
}
$signal = trim($destination, '!');
$rc = $this->getReflection()->getMethod($this->formatSignalMethod($signal));
if (Annotations::has($rc, 'secured') === FALSE) {
return $link;
}
$origParams = $lastrequest->getParams();
$protectedParams = array();
foreach ( $rc->getParameters() as $param) {
$protectedParams[$param->name] = ArrayTools::get($origParams, $this->getParamId($param->name));
}
$args['__secu'] = $this->createSecureHash($protectedParams);
return parent::link($destination, $args);
}
/**
* Creates secure hash from array of arguments.
* @param array $param
* @return string
*/
protected function createSecureHash($params) {
$ns = Environment::getSession('securedlinks');
if ($ns->key === NULL) {
$ns->key = uniqid();
}
$s = implode('|', array_keys($params)) . '|' . implode('|', array_values($params)) . $ns->key;
return substr(md5($s), 4, 8);
}
}
?>
…ale nechápu, proč to nefunguje?. Tento kód jsem použil z fóra. Zabezpečuje odkazy proti CSRF.
// EDIT:
ta funkce Link to asi dělá
Editoval tomaass (29. 10. 2009 9:32)