Odesílání formuláře bez připojené fotky
- Hitny14
- Člen | 90
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.
- Hitny14
- Člen | 90
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
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
->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 : "");
- Hitny14
- Člen | 90
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á
- Hitny14
- Člen | 90
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
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}