NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Podmienka pri prázdnej hodnote uploadu

Aktivity
Avatar
Dominik Gavrecký:24.3.2016 23:49

Ahojte,

natrafil som na jeden problém s podmienkou ktorú neviem nejakým spôsobom vyriešiť. Možno je to len tým že som unavený. Takže mám vytvorený jednoduchý upload kde overujem veľkosť obrázka atď. Ked nahrám oba obrázky so správnymi veľkosťami tak prebehne všetko v poriadku ale ak vynechám timeline a vyplním avatar alebo naopak tak hodí error s hláškou že obrázok ktorý nenahrávam nemá danú veľkosť.

/**
 *
 * @return Form
 */
protected function createComponentProfileForm()
{
    $form = new Form;

    $form->addText('steamid', 'Steam:ID');
    $form->addText('teamspeak', 'Teamspeak3');
    $form->addText('skype', 'Skype');

    $form->addUpload('avatar', 'Avatar:')
        ->addCondition(Form::FILLED)
        ->addRule(Form::IMAGE, 'Avatar musí být JPEG, PNG nebo GIF.');

    $form->addUpload('timeline', 'Timeline')
        ->addCondition(Form::FILLED)
        ->addRule(Form::IMAGE, 'Timeline musí být JPEG, PNG nebo GIF.');

    $form->addText('steam_url', 'Steam');
    $form->addText('twitch_url', 'Twitch');
    $form->addText('youtube_url', 'Youtube');

    $form->addSubmit('send', 'Aktualizovať')->setOmitted();

    $form->onValidate[] = [$this, 'profileFormValidated'];
    $form->onSuccess[] = [$this, 'profileFormSucceeded'];
    return $form;
}

/**
 * @param Form $form
 * @param ArrayHash $values
 */
public function profileFormValidated(Form $form, $values){
    if (!empty($values['avatar'])) {
        $file = $values['avatar'];
        $file_name = $file->getSanitizedName();
        $size = $file->getImageSize();
        if ($size[0] == 200 AND $size[1] == 200) {
            $file->move($this->context->parameters['wwwDir'] . '/img/avatar/' . $file_name);
            $values['avatar'] = $file_name;
        } else {
           $form->addError('Avatar musí mať 200px na 200px');
        }
    }

    if (!empty($values['timeline'])) {
        $file = $values['timeline'];
        $file_name = $file->getSanitizedName();
        $size = $file->getImageSize();
        if ($size[0] == 1919 AND $size[1] == 440) {
            $file->move($this->context->parameters['wwwDir'] . '/img/timeline/' . $file_name);
            $values['avatar'] = $file_name;
        } else {
            $form->addError('Timeline musí mať 1919px na 440px');
        }
    }
}

/**
 *
 * @param Form $form
 * @param ArrayHash $values
 */
public function profileFormSucceeded(Form $form, $values)
{
    $id = $this->getUser()->id;
    $this->userManager->editProfile($values, $id);
    $this->flashMessage('Profil úspešne editovaný');
    $this->redirect('this');
}
Odpovědět
24.3.2016 23:49
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
d4rkw34v3r
Tvůrce
Avatar
Odpovídá na Dominik Gavrecký
d4rkw34v3r:25.3.2016 9:50

Ahoj, problém je v tom, že v metodě profileFormVa­lidated a proměnné $values máš po odeslání formuláře objekt Nette\Http\Fi­leUpload ať už obrázek vybereš nebo ne. Proto ta podmínka vždycky projde a háže tu zprávu o velikosti obrázku.

if (!empty($values['avatar'])) {
}

// a

if (!empty($values['timeline'])) {
}

Když si dumpneš tu proměnnou $values, tak uvidíš, že jsou tam objekty FileUpload, které jsou vlastně prázdné, ale mají nastavenou property error = 4. To číslo 4 znamená NO FILE WAS UPLOADED. http://php.net/…d.errors.php

Takže ta podmínka by měla vypadat spíš nějak takhle:

if ($values['avatar']->isOk()) {
}

// a

if ($values['timeline']->isOk()) {
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
25.3.2016 9:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.