Diskuze: Podmienka pri prázdnej hodnote uploadu

PHP Nette Framework Nette framework Podmienka pri prázdnej hodnote uploadu

Avatar
Dominik Gavrecký:

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. března 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
Člen
Avatar
Odpovídá na Dominik Gavrecký
d4rkw34v3r:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 25. března 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.