Editace akce s možností uploadu obrázku

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

Ahoj,
na webu mám vypisované akce s obrázkem z db. Teď bych je potřeboval upravovat tím způsobem, že když uživatel nepotřebuje změnit obrázek ale jen text, tak bude mít možnost checkboxem zaškrtnou, zda ten obrázek chce nebo ne a na základě toho to bude nebo nebude měnit údaje v db u sloupce s adresou obrázku. Jak na to prosím? Nebo je nějaký lepší způsob jak tohle zajisti? Abych zkrátka mohl editovat akci bez změny obrázku, ale mít i možnost editovat akci s obrázkem?

Díky

Tomáš Votruba
Moderator | 1114
+
0
-

Ahoj, nestačilo by obrázek změnit pouze v případě, kdy jej uživatel nahraje?

Něco ve stylu:

public function processForm($form)
{
	$values = $form->values;
	if ($values->image && $values->image->isOk()) {
		// upload new image

	} else {
		// don't change anything
		unset($values->image);
	}

	// save $values to db
}

Editoval Tomáš Votruba (28. 4. 2014 11:51)

xciza
Člen | 194
+
0
-

Jo, to by mohlo stačit. Kouknu na to.

xciza
Člen | 194
+
0
-

Tak to bohužel vůbec nic neudělá :( Mám tuto obsluhu formuláře:

public function editFormSubmitted(Form $form) {
        $id = (int) $this->getParameter('id');
            $values = $form->getValues();
            if ($values->img && $values->img->isOk()) {
                $file = $values['img'];
                $imgUrl = 'images/data/' . time() . "_" . $file->name;

                $tmp_file = $file->getTemporaryFile();

                $image = Image::fromFile($tmp_file);
                $image->resize(470, NULL);

                $image->save($imgUrl);
            } else {
                unset($values->img);
            }

            $this->private->updateTab($id, $form->values->text, $imgUrl);
            $this->flashMessage('Tab aktualizován', 'success');

        $this->redirect('Private:default');
    }

Pokud obrázek nevyberu, tak po kliknutí na odeslání formuláře se vůbec nic nestane (žádné přesměrování, žádný error, prostě nic). Pokiud obrázek normálně vyberu a form potvrdím tak je vše ok.

Tomáš Votruba
Moderator | 1114
+
0
-

Jak vypadá formulář? Možná tam máš na image nějaké pravidlo.

P.S.: FileUpload má šikovnou metodu toImage(), tou můžeš získat obrázek $values->image->toImage

Editoval Tomáš Votruba (28. 4. 2014 13:02)

xciza
Člen | 194
+
0
-

zde:

protected function createComponentEditForm() {
    $form = new Form();
    $form->addTextArea('text')
            ->getControlPrototype()->class('mceEditor');

    $form->addUpload('img', 'Image:')
            ->addRule(Form::IMAGE, 'File must be an image - .jpg, .gif, .png')
            ->addRule(Form::MAX_FILE_SIZE, 'File size must be maximum 2Mb.', 2147483648);

    $presenter = $this;
    $form->addSubmit('create', 'Submit')->setAttribute('class', 'button');
    $form->addSubmit('cancel', 'Cancel')
                    ->setAttribute('class', 'button gray')
                    ->setValidationScope(FALSE)
            ->onClick[] = function () use ($presenter) {
                $presenter->redirect('default');
            };
    $form->onSuccess[] = callback($this, 'editFormSubmitted');
    $form->addProtection('Vypršel časový limit.'); //Prevent from Cross-Site Request Forgery (CSRF)
    return $form;
}
Tomáš Votruba
Moderator | 1114
+
0
-

Na addUpload přidej addConditionOn, viz dokumentace zde níže

$form->addUpload('img', 'Image:')
	->addConditionOn(Form::FILLED)
		//..
xciza
Člen | 194
+
0
-

Díky, už funguje.