Nette formular uploadFile

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

Zdravim,

ako nastavim pre uploadFile podmienku, ze musi byt nahraty subor?
V podmienkach som nasiel lne

  • MAX_SIZE
  • IMAGE

… Diky

japlavaren
Člen | 404
+
0
-
<?php

$form->addUpload('file')
	->setRequired('select file')
	->addRule($form::IMAGE, 'file must be image');
?>

Editoval japlavaren (31. 12. 2013 19:58)

Takeshi
Člen | 596
+
0
-

japlavaren napsal(a):

<?php

$form->addUpload('file')
	->setRequired('select file')
	->addRule($form::IMAGE, 'file must be image');
?>

To som uz skusal „addRequired(‚asd‘)“, ale funguje mi to len pri „addText“ .

japlavaren
Člen | 404
+
0
-

starsie nette malo bug – pouzi addRule($form::FILLED, ‚select file‘)

japlavaren
Člen | 404
+
0
-

nie addRequired, ale setRequired (add je rule)

Takeshi
Člen | 596
+
0
-

Tak skusal som oboje aj setRequired aj addRule … ale nic nereaguje …

Takeshi
Člen | 596
+
0
-

Oprava !!!

to ‚setRequired‘ mi funguje, len mi nezobrazuje alert() spravu … taktiez mi ju nezobrazuje pri podmienke Form::IMAGE … funguje mi len pri Form::MAX_FILE_SIZE

… P.S. Pouzivam rucne vykreslovanie formulara

<?php
{form registerForm}
{label name} - {input name}
{/form}
?>

Editoval Takeshi (31. 12. 2013 21:05)

Takeshi
Člen | 596
+
0
-

Aspon zatial som urobil nasledovne …

otazka: Ako zistit, ci je subor nahrany

<?php
{/form}
{if $form->isSubmitted()}
    {if !$form->values['image']->size}
        <script>
            alert('Nahraj súbor');
        </script>
    {/if}
{/if}
?>

Este zistit, preco mi nefunguje alert() sprava pri

<?php
->addRule(Form::IMAGE,"Obrázok musí byť typu JPEG, PNG alebo GIF.")
?>

ale pri

<?php
->addRule(Form::MAX_FILE_SIZE,"Súbor musí mať veľkosť menšiu ako 8 MB.",8*1024*1024)
?>

mi to funguje

Editoval Takeshi (31. 12. 2013 22:09)

Takeshi
Člen | 596
+
0
-

Pravdepodobne idem na to zlozitejsie , ale pokial sa nevysvetli ta zahada … teda preci mi nefunguje

<?php
->addRule(Form::IMAGE,"Obrázok musí byť typu JPEG, PNG alebo GIF.")
?>

tak nemam inu moznost … zistit, ci subor je obrazok … nasiel som funkciu ->isImage()

<?php
{if $form->isSubmitted()}
    {if !$form->values['image']->isImage()}
        <script>alert("Daný súbor nie je obráyok");</script>
    {/if}
{/if}
?>

Editoval Takeshi (31. 12. 2013 22:49)

Takeshi
Člen | 596
+
0
-

Viete teda niekto preco mi nefunguje horeuvedeny problem? (Nie vsetkym sa chce citat cela strana, tak tuto temu obnovim) …

Pri ‚rucnom‘ vykresleni formulara v sablone, mi pri nespravnom vyplneni formulara nezobrazuje alert() spravu pre nasledovne …

<?php
$form->addUpload("image","Fotka *")
     ->setRequired("Všetky polia musia byť vyplnené.") // nezobrazuje sa
     ->addRule(Form::IMAGE,"Obrázok musí byť typu JPEG, PNG alebo GIF.") //nezobrazuje sa
     ->addRule(Form::MAX_FILE_SIZE,"Súbor musí mať veľkosť menšiu ako 8 MB.",8*1024*1024); //zobrazuje sa
?>
japlavaren
Člen | 404
+
0
-

nette validacia ma 2 kroky:

  • validuje sa na strane klienta (v prehliadaci) kde dokaze overit ci bol ten subor vybraty (setRequired). bohuzial ci sa jedna o obrazok, alebo aka je jeho realna velkost zistit nedokaze
  • nasledne sa validuje znova vsetko na servery (ak by nikekto klientsku validaciu oklmal) a chyby sa vypisuju uzivatelovi

dobra rada – najprv si sprav funkcnost nad automaticky vykreslenou komponentou, potom ju renderuj sam. totiz ak ju renderujes sam, tak si musis vypisat errory sam (a vypisat aj hidden polia, vratane add protection hiddenu)

k tvojmu problemu – nevypisujes errory, fixni si to cca takto

{form registerForm}
	<ul n:if="$form->hasErrors()" class="errors">
		<li n:foreach="$form->errors as $error"><strong>{$error}</strong></li>
	</ul>

	{label name} - {input name}
{/form}
Takeshi
Člen | 596
+
0
-

japlavaren napsal(a):

nette validacia ma 2 kroky:

  • validuje sa na strane klienta (v prehliadaci) kde dokaze overit ci bol ten subor vybraty (setRequired). bohuzial ci sa jedna o obrazok, alebo aka je jeho realna velkost zistit nedokaze
  • nasledne sa validuje znova vsetko na servery (ak by nikekto klientsku validaciu oklmal) a chyby sa vypisuju uzivatelovi

dobra rada – najprv si sprav funkcnost nad automaticky vykreslenou komponentou, potom ju renderuj sam. totiz ak ju renderujes sam, tak si musis vypisat errory sam (a vypisat aj hidden polia, vratane add protection hiddenu)

k tvojmu problemu – nevypisujes errory, fixni si to cca takto

{form registerForm}
	<ul n:if="$form->hasErrors()" class="errors">
		<li n:foreach="$form->errors as $error"><strong>{$error}</strong></li>
	</ul>

	{label name} - {input name}
{/form}

Toto som uz skusal, akurat, ze som tam nemal ten vypis <strong>{$error}</strong> … noziadna zmena

jiri.pudil
Nette Blogger | 1032
+
0
-

@Takeshi: alertem zřejmě myslíš client-side validaci, kterou obstarává netteForms.js, že? Vypadá to, že je v tom skriptu chyba: hodnotu file inputu (v prohlížečích, které to podporují) totiž vrátí jako FileList, ale ve validátoru filled s tím už nepočítá. Pošlu pull request.

@japlavaren: hidden pole ručně vykreslovat nemusíš, Nette to i tak udělá za tebe

Matey
Člen | 142
+
0
-

ako je to s tým addUpload() momentálne?

snažím sa všemožne zabrániť odoslaniu formu bez vyplnenia uploadu ale nedarí sa mi

<?php
->addRule(Form::FILLED); // odošle
->setRequired(); // odošle
->addRule(Form::IMAGE); // odošle
?>

skúšal som rôzne kombinácie, prípadne aj addCondition ale nič nezabráni odoslaniu

používam 2.1.2

celé to momentálne vyzerá takto.. jednoduchý form len na obrázok

<?php
protected function createComponentCarouselAddForm()
{
	$form = new Form;
	$form->addUpload('image', 'Pridať obrázok:')
		->setRequired('Vyber obrázok')
		->addRule(Form::FILLED, 'Vyber obrázok')
		->addRule(Form::IMAGE, 'Obrázok musí byť JPEG alebo PNG.');
	$form->addSubmit('save', 'Uložiť');

	$form->onSubmit[] = $this->carouselAddFormSucceeded;
	return $form;
}

public function carouselAddFormSucceeded(Form $form)
{
	\Nette\Diagnostics\Debugger::barDump($form->getValues()->image->error,'$form');
	if ($form->getValues()->image->error !== 0) {
		$form->addError('Vyber obrázok.');
		$this->flashMessage('Vyber obrázok.');
		$this->redirect('this');
	}
	$values = $form->getValues();
	...
}
?>

toto je len taký test, addError to do formu neprída, nvm prečo, tak sa dostanem až ku flash a redirectu..

bez tohoto by som sa pri nevyplnenom uploade dostal sem
Method Nette\Http\FileUpload::__toString() must return a string value

edit: hm, vrátim sa k tomu o pár min neskôr a všetko ide ako má..? tak sorry, už je to bezpredmetné.. zle som premazal cache prehliadača, stále to v sebe malo starý netteForm.js :( taká blbosť

Editoval Matey (29. 3. 2014 12:02)

David Matějka
Moderator | 6445
+
0
-

@Matey: onSubmit event se vola vzdy, pouzij onSuccess

Matey
Člen | 142
+
0
-

@matej21: ďakujem za upozornenie, v ostatných formulároch to tak mám.. tento som písal z pamäti a samozrejme s chybou.. :) už som si aj prešiel dokumentáciu, aby som si zopakoval v čom je rozdiel
THX