Zaseknutí při první aplikaci

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

Dobrý den,
tvořím v nette svou první apliakci. Přes mraky chyb které vznikli nepozorností sem se již prokousal ale nemůžu přejít přes chybu následující

v defaultpresenteru mám toto

<?php
class DefaultPresenter extends BasePresenter
{
  Protected function createComponentMyform()
  {

     $items= array('Jihočeský','Jihomoravský','Karlovarský','Královehradecký');

     $myform = new AppForm();
        $myform->addText('nazev', 'Přesný název zařízení');
         $myform->addSelect('Kraj','Kraj',$items);
                $myform->addSubmit('ok', 'Send')
            ->onClick[] = array($this, 'okClicked');

        $myform->addSubmit('cancel', 'Cancel')
            ->setValidationScope(FALSE) // prvek se nebude validovat
            ->onClick[] = array($this, 'cancelClicked');
        // alternativa:
        // $myform->onSubmit[] = array($this, 'formSubmitted');

        return $myform;
  }

  public function cancelClicked()
  {
  redirect ('default');
  }


  public function okClicked()
  {
    $a=$myform->getvalues();
    Debug::dump($button->getForm()->getValues());
    $myzaznam = new Zaznam;
                 $zaznam->find($a);
    return $zaznam;
  redirect ('table');
  }


    public function formSubmitted(AppForm $myform)
    {
        // manual processing
        if (!$myform['cancel']->isSubmittedBy()) ;
    }

public function RenderDefault()
  {

  }
}

v šabloně default toto:

{block #content}
{control Myform}

při spuštění aplikace mi laděnka hází Component with name ‚Myform‘ does not exist.

Nevíte čím to?

Editoval Jan Tvrdík (9. 2. 2010 14:55)

Ondřej Mirtes
Člen | 1536
+
0
-

Vítej na fóru!

Mám pro tebe pár poznámek – formátuj zdrojový kód podle návodu. Nauč se používat tabulátory a správně formátuj svůj kód – coding standards :)

Tvůj zdroják bych upravil takto:

protected function createComponentMyForm()
{

	$items = array('Jihočeský', 'Jihomoravský', 'Karlovarský', 'Královehradecký');

	$myform = new AppForm();
	$myform->addText('nazev', 'Přesný název zařízení');
	$myform->addSelect('Kraj', 'Kraj', $items);
	$myform->addSubmit('ok', 'Send');

	$myform->addSubmit('cancel', 'Cancel')
		->setValidationScope(FALSE) // prvek se nebude validovat
		->onClick[] = array($this, 'cancelClicked');

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

	return $myform;
}

public function cancelClicked(SubmitButton $button)
{
	$this->redirect('default');
}

public function formSubmitted(AppForm $myform)
{
	//zpracování formuláře
}

public function renderDefault()
{

}

V šabloně pak formulář vykreslíš pomocí {widget myForm} nebo {control myForm} (měls špatně velikost písmen, jak v metodě, tak v šabloně).

Edudant
Člen | 18
+
0
-

Upravil jsem ty písmena ale stále to háže chybu.
BTW: omlouvám se za špatné formátování kódu.

Jakub Lédl
Člen | 55
+
0
-

Mám takové mlhavé tušení, že ten problém s neexistující komponentou může vzniknout, pokud je oldLayoutMode nastaven na TRUE, ale používám nové šablony.

Zkus přidat do BasePresenteru:

<?php

  public $oldLayoutMode = FALSE;

?>

Ad velikost písmen – myslím, že ta byla v orig. zdrojáku správně, ne? createComponentMyform i {widget|control myform} – malé f.

Ondřej Mirtes
Člen | 1536
+
0
-

Vždy ukaž kód, který ti nefunguje. Musel ses překlepnout, anebo se na komponentu odkazuješ v šabloně jiného presenteru, než kde máš tu továrničku :)

Edudant
Člen | 18
+
0
-

to starý šablonování mam vyplé.
S těmi názvy mám nějaký zmatek
když vytvořím komponentu AhOj tak jí volám i AhOj ne?

šablonu mam uloženou v templates/Default/default.phtml
a presenter v presenters/DefaultPresenter.php

Edudant
Člen | 18
+
0
-

Tak už jsem to zprovoznil. Ted pracuji na dalších chybách. Mám tam zbytečně navíc nějaké metody. Díky moc.

Jakub Lédl
Člen | 55
+
0
-

A v čem byla chyba? :-)

Edudant
Člen | 18
+
0
-

Chyba byla v tom, že jsem po upravení chybného kódu nesmazal temp.


Ještě něco, dá se použít tahle funkce v modelu? Háže mi to chybu spíš mi jde o to jestli můžu předat jako parametr pole a pak ho v tom dotazu takhle vložit.

<?php
public function find($podminka)
 	   {

        return $this->connection->select('* from zaznam where 'nazev'='%$podminka[nazev]%' and 'kraj'='%$podminka[kraj]%'' )->execute(dibi::IDENTIFIER);
    }
?>

Editoval Edudant (9. 2. 2010 14:18)

sodae
Nette Evangelist | 250
+
0
-

Využívám možnosti dibi fluent , toto je uplně primitivné sql dotaz

public function find($podminka)
{
        return $this->connection->select('*')
				->from('zaznam')
				->where("nazev = %s", $podminka['nazev'])
				->where("kraj = %s", $podminka['kraj'])
				->execute(dibi::IDENTIFIER);
}
Edudant
Člen | 18
+
0
-

a ,ůžu tímto způsobem přidávat k proměné zástupné znaky % ? jkde mi to to že tvoříém vyhledávání v tabulce kdem á uživatel možnost zadat nebo nezadat všechyn prvky formuláře tudíž kdyř ho nezadá bude v podmínce vlastně jen neco = %% což by nemělo dělat neplechu..
resp když tam dám např LIKE

Editoval Edudant (10. 2. 2010 8:29)

lucass
Člen | 89
+
0
-

Já bych to dělal asi nějak takto:

<?php
	...

	public function find($podminka) {
	        $q = $this->connection->select('*')->from('tabulka');

		if (isset($podminka['nazev']) {
			$q->where('nazev')->like('%s', '%' . $podminka['nazev'] . '%');
		}

		return $q->execute(dibi::IDENTIFIER);
	}

	...
?>
Edudant
Člen | 18
+
0
-

jo to je přesně ono. Dík moc

Edudant
Člen | 18
+
0
-

mám ještě další problém.
Mám tuto funkci ve svém modelu. „céčka“ jsou převzaty z formulářových checkboxů- nevíím jeslti mám dobře nastaven jejich typ a jecjich porovnávání. kažodopádně takhle mi to vrací všechny záznamy. Filtrují se pouze proměné $a a $b tz céčka už ne :-/
Nevíte v čem je chyba? Dík

<?php

public function findrett($a,$b,$c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,$c9,$c10,$c11,$c12,$c13,$c14,$c15,$c16,$c17)
 	   {
           $dato = dibi::select('*') ->from($this->table);
if (isset($a)) {
$dato->where('Zarizeni')->like('%s','%' . $a . '%' )	;
}
if ($b!='Vse') {
           $dato->where('Code_Kraj=%s',$b);
}
if ($c1=='1') {
           $dato->where('S1=%s','ano');
}
if ($c2=='1') {
           $dato->where('S2=%s','ano');
}
if ($c3=='1') {
           $dato->where('S3=%s','ano');
}
if ($c4=='1') {
           $dato->where('S4=%s','ano');
}
if ($c5=='1') {
           $dato->where('S5=%s','ano');
}
if ($c6=='1') {
           $dato->where('S6=%s','ano');
}
if ($c7=='1') {
           $dato->where('S7=%s','ano');
}
if ($c8=='1') {
           $dato->where('S8=%s','ano');
}
if ($c9=='1') {
           $dato->where('S9=%s','ano');
}
if ($c10=='1') {
           $dato->where('S10=%s','ano');
}
if ($c11=='1') {
           $dato->where('S11=%s','ano');
}
if ($c12=='1') {
           $dato->where('S12=%s','ano');
}
if ($c13=='1') {
           $dato->where('S13=%s','ano');
}
if ($c14=='1') {
           $dato->where('S14=%s','ano');
}
if ($c15=='1') {
           $dato->where('S15=%s','ano');
}
if ($c16=='1') {
           $dato->where('S16=%s','ano');
}
if ($c17=='1') {
           $dato->where('S17=%s','ano');
}



      return  $dato;}

?>

Editoval Edudant (11. 2. 2010 11:07)

Vyki
Člen | 388
+
0
-

To je docela divočina ten počet argumentů. Možná by bylo lepší přenášet to v nějakém poli nebo alespoň použít funci func_get_args(), která umí s proměnným počtem parametrů lépe pracovat. Při hledání chyby postupuj systematicky. Pomocí Debug::consoleDump($) zjisti, které parametry se předají.

<?php
public function findrett($a,$b,$c1,$c2,$c3,$c4,$c5,$c6,$c7,$c8,$c9,$c10,$c11,$c12,$c13,$c14,$c15,$c16,$c17)
{
    $args = func_get_args();
    Debug::consoleDump($args);

    [...]
}

?>
Patrik Votoček
Člen | 2221
+
0
-

Ty krávo to je haluz!!! OMFG!!!
Nejdříve si to zjednoduš … Asi něják takto:

<?php
public function findrett($a,$b,$other = array())
{
	$dato = dibi::select('*') ->from($this->table);
	if (isset($a)) //tohle me pripada divne... spis bych psal if ($a != NULL)
		$dato->where('Zarizeni')->like('%s','%' . $a . '%' ); //nejak nevidim/nechapu co se 'lajkuje'
	if ($b != 'Vse') //nevim co tohle je ale budiz
           $dato->where("[Code_Kraj] = %s",$b);
	foreach ($other as $key => $value)
	{
		if ($value == TRUE)
			$dato->where("[".$key."] = 'ano'");
	}

	return $dato;
}
?>

A pak řeš chybu

Editoval vrtak-cz (11. 2. 2010 16:16)

Jod
Člen | 701
+
0
-

S tebou pracovať tak ma zavrú :D:D:D:D:D