Ako pri update príspevku nenahrať znova ten istý obrázok

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

Zdravím ľudia…
Riešim taký malý zádrhel s update-tom príspevku normálne vytvorím nový príspevok teda (názov, obrázok a text) všetko je ok až na úpravu keď upravujem príspevok a nevyberiem obrázok vyhodí mi túto chybu

Warning
rename(,assets/web/default/images/news/): Invalid argument
Source file

File: ...\tennails\vendor\nette\http\src\Http\FileUpload.php:152

142:
143:        /**
144:         * Move uploaded file to new location.
145:         * @param  string
146:         * @return self
147:         */
148:        public function move($dest)
149:        {
150:            @mkdir(dirname($dest), 0777, TRUE); // @ - dir may already exist
151:            @unlink($dest); // @ - file may not exists
152:            if (!call_user_func(is_uploaded_file($this->tmpName) ? 'move_uploaded_file' : 'rename', $this->tmpName, $dest)) {
153:                throw new Nette\InvalidStateException("Unable to move uploaded file '$this->tmpName' to '$dest'.");
154:            }
155:            chmod($dest, 0666);
156:            $this->tmpName = $dest;

Takže musím znova nahrať ten istý obrázok vtedy všetko prebehne bez chyby neviem ako povedať formuláru že ak nechcem nahrať obrázok ostane ten pôvodný a ostatné úpravy sa vykonajú…

Používam Nette 2.3.7
Formulár používam z Nette 2.3.7->examples->CD-collection čiže je aj na pridávanie aj na úpravu a na upload obrázku som použil tento príklad/príspevok

/**
	 * Edit form factory.
	 * @return Form
	 */
	protected function createComponentNewsForm() {
		$newsForm = new Form;
		$newsForm->addText('newsTitle', 'Názov novinky')
				 ->setAttribute('class', 'form-control');
		$newsForm->addUpload('imageType', 'Nahrať obrázok');
		$newsForm->addTextArea('newsText', 'Text')
				 ->setAttribute('class', 'form-control');
		$newsForm->addText('newsDateAdd')
				 ->setAttribute('hidden', 'hidden');
		$newsForm->addText('newsTimeAdd')
				 ->setAttribute('hidden', 'hidden');
		$newsForm->addSubmit('addNews', 'Pridať do noviniek')
			->setAttribute('class', 'btn btn-success btn-lg noBorder noRadius')
			->onClick[] = array($this, 'newsFormSucceeded');

		$newsForm->addSubmit('cancel', 'Zrušiť')
			->setAttribute('class', 'btn btn-info btn-lg noBorder noRadius')
			->setValidationScope(array())
			->onClick[] = array($this, 'formCancelled');

		$newsForm->addProtection();
		return $newsForm;
	}


	public function newsFormSucceeded($button) {
		$values = $button->getForm()->getValues();
		$id = (int) $this->getParameter('id');
		$values->newsDateAdd = date('d.m.Y');
		$values->newsTimeAdd = date('H:i:s');
		$filename = $values->imageType->getName();
		$path = 'assets/web/default/images/news';
		$values->imageType->move($path.'/'.$filename);
		if ($id) {
			$this->newsRepository->findById($id)->update($values);
			$this->flashMessage('Novinka bola aktualizovaná!', 'warning');
		} else {
			$this->newsRepository->insert($values);
			$this->flashMessage('Novinka bola pridaná!', 'success');
		}
		$this->redirect(':Webadmin:Docs:novinky');
	}

Všetkým vopred Ďakujem za pomoc…

cubic
Člen | 45
+
0
-

Úplně stačí, když si zkontroluješ, zda byl ve formuláři nějaký obrázek vybraný. Zhruba takhle nějak:

<?php
if (!empty($values->imageType)) {
	$filename = $values->imageType->getName();
	$path = 'assets/web/default/images/news';
	$values->imageType->move($path.'/'.$filename);
}
?>
SontoEremo
Člen | 341
+
0
-

Nazdar @cubic
Vďaka za pomoc sorry ale kam mám ten tvoj kód umiestniť? :D ja viem Laická otázka ale fakt neviem, že kam…

cubic
Člen | 45
+
0
-

@SontoEremo Obal tou mojí podmínkou ty 3 řádky, které tam už máš (a které mám v podmínce).
Nebo-li pokud je vybraný obrázek, nastaví se $filename, $path a přesune obrázek na zvolenou cestu.

Kromě toho bys ale ještě měl kontrolovat, jestli je uploadovaný soubor skutečně obrázek pomocí isImage().

<?php
public function newsFormSucceeded($button) {
	$values = $button->getForm()->getValues();
	$id = (int) $this->getParameter('id');
	$values->newsDateAdd = date('d.m.Y');
	$values->newsTimeAdd = date('H:i:s');

	if (!empty($values->imageType) && $values->imageType->isImage()) {
		$filename = $values->imageType->getName();
		$path = 'assets/web/default/images/news';
		$values->imageType->move($path.'/'.$filename);
	}

	if ($id) {
		$this->newsRepository->findById($id)->update($values);
		$this->flashMessage('Novinka bola aktualizovaná!', 'warning');
	} else {
		$this->newsRepository->insert($values);
		$this->flashMessage('Novinka bola pridaná!', 'success');
	}
	$this->redirect(':Webadmin:Docs:novinky');
}
?>
SontoEremo
Člen | 341
+
0
-

Ďakujem za kód aj pomoc aj trpezlivosť ale stále to nerieši môj problém
keď dám upraviť zmením názov text ale obrázok už nevyberem tak mi to síce aktualizuje úpravu ale obrázok sa zmaže

cubic
Člen | 45
+
+1
-

Protože nevidím šablonu na frontendu ani strukturu tabulky, tak je to takové tipování. Nejspíš ti tam ale prázdná hodnota v imageType přepisuje záznam v DB, takže ji stačí odstranit pomocí unset().

<?php
if (!empty($values->imageType) && $values->imageType->isImage()) {
	/* původní kód */
} else {
	unset($values->imageType);
}
?>
SontoEremo
Člen | 341
+
0
-

HALELUJA :) @cubic Ďakujem pomohlo