Odesílání formuláře bez připojené fotky

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

Ahoj, vytvořil sem si formulář který mi nahraje fotku naserver a do databaze se uloži popis nazev a cesta k fotce. Když ve formuláři vyberu fotku vśechno funguje dobře. Ale problém nastává když chci formulář odeslat bez fotky tak neproběhne nic. Nevíte někdo jak na to? Děkuji.

Azathoth
Člen | 495
+
0
-

Záleží na to, jak přesně máš ten formulář dělaný. Ukaž zdrojáky.

Hitny14
Člen | 90
+
0
-

Formulář:

public function createComponentAddNovinky()
    {
        $form = new Form;
        $form->addText('nazev')
                ->addRule(Form::FILLED, 'Zadejte název novinky');
        $form->addUpload('obrazek')
                ->addRule(Form::IMAGE, 'Obrázek musí být JPEG, PNG nebo GIF.');
        $form->addTextArea('popis')
                ->addRule(Form::FILLED, 'Zadejte popis novinky');
        $form->addSubmit('send', 'Přidat noviku');
        $form->onSuccess[] = $this->processAddNovinky;

        return $form;
    }

Zpracování:

public function processAddNovinky($form)
    {
        $values = $form->getValues();
        try {
                $file = $values->obrazek;
                if($file->isImage() and $file->isOk()) {
                  $file_ext=strtolower(mb_substr($file->getSanitizedName(), strrpos($file->getSanitizedName(), ".")));
                  $file_name = uniqid(rand(0,20), TRUE).$file_ext;
                  $file->move(WWW_DIR . '/data/'. $file_name);

                  $image = \Nette\Image::fromFile(WWW_DIR . '/data/'. $file_name);
                  if($image->getWidth() > $image->getHeight()) {
                    $image->resize(240, NULL);
                  }
                  else {
                    $image->resize(NULL, 140);
                  }
                  $image->sharpen();
                  $image->save(WWW_DIR . '/data/thumbs/'. $file_name);
                }
                $fileTarget = "data/". $file_name;
                $this->novinkyModel->AddNovinky($values, $fileTarget, $file_name);
                $this->flashMessage('Novinky bylo uspěšně přidáno', 'success');
                $this->redirect('Nastroje:novinky');
        } catch (Exception $e) {
            throw new NovinkyException;
        }
    }
Azathoth
Člen | 495
+
-1
-

Nepomůže tohle? Před addRule zkus dát ->addCondition(Form::FILLED)

Azathoth
Člen | 495
+
0
-

Možná to tam vidím. Když nenahraješ obrázek, jakou hodnotu má $file?
Zkus si to vypsat pomocí bardumpu. Protože jestli ti to na prvním řádku spadne, protože tam žádný obrázek není, tak je logické, že se nic nestane, protože se to zachytí až dole v tom catchi.

Hitny14
Člen | 90
+
0
-

když dám před addRule ->addCondition(Form::FILLED)
Chyba: Undefined variable: file_name

Jak si prosím používá ten bardump ještě sem se s tím nesetkal.

Azathoth
Člen | 495
+
0
-

Aha, tak ten addCondition byl možná hloupý nápad.
A k tomu bardumpu:
https://tracy.nette.org/cs/
Tracy/laděnka umožňuje mimo jiné bardump, což je vypsání proměnné do té lišty vpravo dole, která se objeví, když je zapnutý debug mód.
https://api.nette.org/…ebugger.html
Takže zavoláním \Tracy\Debugger::barDump($promenna) můžeš do té lišty vypsat nějakou proměnnou, bere to i objekty. Je to ideální právě na tyhle případy, kdy se program chová neočekávaně, tak můžeš zjistit, kde to blbne.

Kromě bardump doporučuji zkusit i firelogger (viz tu stránku z nette dokumentace o debuggingu), ten zase vypisuje proměnné do firebugu, což je extension pro firefox.

Editoval Azathoth (21. 9. 2014 14:02)

Mysteria
Člen | 797
+
+1
-

->addCondition(Form::FILLED) je správně. Ty máš problém ve zpracování. Logicky, když neuploadneš soubor, tak se ti nevykonná tenhle kód

if ($file->isImage() and $file->isOk()) {
			$file_ext = strtolower(mb_substr($file->getSanitizedName(), strrpos($file->getSanitizedName(), ".")));
			$file_name = uniqid(rand(0, 20), TRUE) . $file_ext;
			$file->move(WWW_DIR . '/data/' . $file_name);

			$image = \Nette\Image::fromFile(WWW_DIR . '/data/' . $file_name);
			if ($image->getWidth() > $image->getHeight()) {
				$image->resize(240, NULL);
			} else {
				$image->resize(NULL, 140);
			}
			$image->sharpen();
			$image->save(WWW_DIR . '/data/thumbs/' . $file_name);
		}

takže pak logicky nemáš definovanou proměnnou $file_name, kterou použiješ tady

$this->novinkyModel->AddNovinky($values, $fileTarget, $file_name);

Jako rychlej fix, to můžeš udělat třeba takto:

$this->novinkyModel->AddNovinky($values, $fileTarget, isset($file_name) ? $file_name : "");
Lkopo
Člen | 65
+
+1
-

Poprípade deklarovať $file_name = ''; pred podmienkou.

Myiyk
Člen | 321
+
+2
-

Používat u odchytávání nejvyšší Exception, který zachytí vše není zrovna ideální.

Můžeš mít někde chybu a nezjistíš to.

Dávej catch na přesné exception u kterých očekáváš, že se tam můžou dostat a aspoň můžeš zobrazil příslušnou chybovou zprávu nebo si to poznamenat do logu.

Azathoth
Člen | 495
+
0
-

Souhlasím s Myiykem. Už jsem si užil pár hodin debuggování, když se mi chytala výjimka, která se cyhtat neměla. A to nepřeju nikomu.

Editoval Azathoth (21. 9. 2014 15:43)

Hitny14
Člen | 90
+
0
-

Díky kod sem upravil a použil sem isset($file_name).
Ještě bych se se chtěl zeptat jak zjistím jestli pole v tabulce je prázdné

vím jak to zjistit u celé tabulky:

$this->database->table('novinky')->fetch();

a pro konkrétní pole v tabulce sem to upravil:

$this->database->table('novinky')->where('fileName')->fetch();

ale nic to nedělá

Mysteria
Člen | 797
+
0
-
->where('column IS NULL')

Editoval Mysteria (22. 9. 2014 14:31)

Hitny14
Člen | 90
+
0
-

Model:

public function obrazekNovinky()
    {
        return $this->database->table('novinky')->where('fileName IS NULL')->fetch();
    }

Presenter:

public function renderNovinky()
    {
        $this->template->obrazekNovinek = $this->novinkyModel->obrazekNovinky();
    }

šablona:

{if $obrazekNovinek == null}
    <img src="{$basePath.'/images/nahled-neni-k-dispozici.jpg'}">
{else}
    <img src="{$basePath.'/data/thumbs/'.$item->fileName}">
{/if}

Chtěl bych když bude v databazi vyplněné pole fileName a by se mi v šabloně ukázal obrázek co sem nahrál. a když v poli fileName nebude nic aby se mi ukázal obrázek náhled není k dispozici. ale když použuji kod co je víše uveden zobrazují se mi v šabloně jen obrázky s „Náhled není k dispozici“ Nevíte někco kde mám chybu?

David Matějka
Moderator | 6445
+
0
-

smaz to ->where('fileName IS NULL') a pouzij proste

{if $item->fileName === NULL}
    <img src="{$basePath.'/images/nahled-neni-k-dispozici.jpg'}">
{else}
    <img src="{$basePath.'/data/thumbs/'.$item->fileName}">
{/if}
Hitny14
Člen | 90
+
0
-

Díky, já tady vymýšlím takový složitosti a tohle mě vůbec nenapadlo..