Formulář nic nedělá

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

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

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

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.

redhead
Člen | 1313
+
0
-

nemůže to být právě tím odkomentovaným alternativním řádkem? To že je tam napsáno alternativa tam třeba není pro srandu. Ale nezkoušel jsem..

// alternativa:
$form->onSubmit[] = array($this, 'formSubmitted');

Editoval redhead (28. 10. 2009 22:39)

tomaass
Člen | 74
+
0
-

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

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

# PHP 5.2.3
# Apache/2.2.4 (Win32) PHP/5.2.3
# Nette Framework 0.9.2-dev (revision b121de2 released on 2009–09–25)

widget nepomohl,

Výpis laděnky jsem uploadoval sem.

Tomik
Nette Evangelist | 485
+
0
-

Ukaž prosím kód BasePresenteru…

tomaass
Člen | 74
+
0
-

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)

Tomik
Nette Evangelist | 485
+
0
-

Ano, zřejmě se jedná o nějakou chybu v tom kódu. Mimo jiné, to že je problém v BasePresenteru je napsáno ve výpisu Landěky (Variables >) – výpis $e toho warningu… :)