Manipulace s obrázky [Nový ImageStorage]

flexroad
Člen | 117
+
0
-

Ahoj,

narazil jsem na chybku u 1.4.2…

Pokud potrebuji zmenit u obrazku nazev souboru a ulozit tak to nefunguje. U verze 1.4.1 bylo vse funkcni a v poradku.

$savedImage = $this->imageStorage->saveUpload($fileUpload, 'namespace');
//tady kontroluji, jestli se obrazek podarilo nahrat a vytvarim zaznam v databazi -> vrati $recordId
$newFilename = $recordId . "-" . $filename;
$savedImage->setName($newFilename);
$savedImage->save();

Nejake napady, co muze byt spatne?

Diky @flexroad

Martk
Člen | 656
+
+1
-

@flexroad Vypadá to, že v nejbližší době si k tomu zase sednu a něco napíšu.

$upload = $this->imageStorage->saveUpload($fileUpload, 'namespace', FALSE); // FALSE - Neuloží se automaticky ve funkci

$upload->setName('myName.jpg'); // Ještě přibude setter na příponu.
$upload->save();
Jan Mikeš
Člen | 771
+
0
-

@Antik jen nápad, co kdyby {img NULL} a <img n:img=„NULL“> vracelo obrázek noimage? Momentálně se mi děje to, že do src se dá něco jako #/noimage, nevím jestli je chyba u mě, dá se to samozřejmě ošetřit tím, že zjistím, jestli v proměnné, kterou do makra dávám, není NULL atd… je to jen nápad :)

Martk
Člen | 656
+
0
-

@Lexi hastag se nastaví, pokud obrázek noimage neexistuje nebo proměnná není nastavena viz. https://github.com/…ge/Image.php#L68

Editoval Antik (31. 7. 2015 22:07)

Jan Mikeš
Člen | 771
+
0
-

Díky moc, toho bych si nevšiml!!
Mám v gitignore

www/img-upload/*
!www/img-upload/noimage/original/noimage.png

Jenže 2. řádek s ignorací noimage.png jsem přidal až později, bylo tedy třeba vyčistit cache gitu :).
Jen pro zajímavost, jak řešiš .gitignore ty @Antik ?

Martk
Člen | 656
+
+1
-

@Lexi jestli myslíš konkrétní soubor .gitginore, tak ano, používám to takhle.

@flexroad V master verzi lze použít tvoje řešení bez potíži, ale musíš počítat, když bude argument $save true, tak se nahraná hodnota do originální složky.

Pro ostatní: přemýšlel jsem, že bych mohl nahodit kompresi obrázků pro originální soubory (už to mám rozdělané, ale chci slyšet názor ostatních).

  1. Buďto použít api od: https://tinypng.com/ (Kompresi 500 obrázků zdarma)
  2. Použít https://pngquant.org/
  3. Komprese obrázku zabírá někdy hodně, takže by se mohli obrázky ukládat do tempu (soubor se seznamem obrázků) a následně cronem se ty obrázky komprimovat (možná bude nějaký limit obrázky, kdy to ukládat do tempu, při uploadu, aby se to dlouho nekomprimovalo?). Když se dosáhne limitu 500 obrázků (nebo nastaveného limitu), tak se obrázky automaticky budou do tempu. Promyšlené do detailu to mám jak bych to udělal, aby to bylo uživatelský příjmné, ale zajímá mě názor zda to tam chcete mít nebo vytvořit zvláštní extension nebo to vynechat.
  4. Tady není snad co dodat.

Editoval Antik (6. 8. 2015 12:22)

Jan Mikeš
Člen | 771
+
+1
-

@Antik tvuj plugin vyuzivam dost casto a temer vsude, osobne bych byl za to, aby komprese obrazku byla volitelna a) globalne jako nastaveni v configu extension b) toto globalni nastaveni prepsat napr u controlu ve formu $myUploadControl->activateCompression() / $myUploadControl->deactivateCompression() nebo primo pri uploadu… nebo neco na ten zpusob, ne pro kazdeho a ne vzdy muze byt komprese zadouci, ale verim ze na toto jsi myslel :)

Editoval Lexi (6. 8. 2015 20:52)

flexroad
Člen | 117
+
0
-

Ahoj,

nejaky napad, jak totu skvelou komponentu napojit na nejaky cloud storage, napriklad Amazon S3?

@flexroad

Martk
Člen | 656
+
+1
-

@flexroad Už je to skoro připravené na napojení viz. connectory (možná to bude chtít ještě upravit, nedíval jsem se ještě na Amazon)

ryder
Člen | 17
+
0
-

Ahoj, narazil jsem ve verzi 1.4.3 na pár problémů s komponentou MultiUploadControl.

  1. je potřeba kdyby/forms-replicator, ale není uvedený v composer.json, takže je pak potřeba doinstalovat ručně
  2. odeslání formuláře končí Call to a member function isOk() on a non-object v souboru /vendor/webchemistry/images/src/Addons/UploadControl.php:79 zkusil jsem to nějak debugovat a vypadá to, že $upload obsahuje pole

Jinak super komponenta, která ušetří hodně času. Díky

Martk
Člen | 656
+
0
-

@ryder MultiUploadControl budu dávat do odděleného balíčku

ryder
Člen | 17
+
0
-

@Antik Ok, díky za info.

Croc
Člen | 270
+
0
-

Zdravím,
zatím se seznamuji s touto komponentou, ale měl bych jednu otázku. Kde je dostupný MultiControlUpload? Je tu zmiňovaný, ale verzi 1.4.3 ho nevidím.

Dále bych se chtěl prosím zeptat ohledně instalace WebChemistry-Forms-Controls (odkaz). Nechybí v návodu configurace v configu .neon (nebo pro bootstrap)? Dle uvedeného návodu se mi to nedaří rozběhnout.

Díky

Martk
Člen | 656
+
0
-

@Croc Komponenta je dostupná tady: https://github.com/…dControl.php , ale nedoporučuji používat, protože neobsahuje testy a bude se rozdělovat na jiný balíček.

Instalace je přes trait v základní formuláři. Staticky jsem to zamítl, kvůli našeptávání v ide.

class MyForms extends Nette\Application\UI\Forms {

    use WebChemistry\Forms\Controls\TForm;
}

Použití:

$form = new MyForms;

$form->addDate('date', 'Datum'); // atd.

Editoval Antik (17. 11. 2015 14:17)

flexroad
Člen | 117
+
+1
-

Ahoj,

netusite nekdo jak vyresit upload animovaneho gifu? Kdyz to uploadnu s pomoci storage->saveUpload, ulozi se mi jen staticky gif (prvni obrazek animace)…

Diky,

Flexroad

Martk
Člen | 656
+
0
-

Přepsal jsem tento doplněk od základu a vyházel jsem věci, které jsem ještě nepoužil, kdyby vám něco chybělo z minulého doplňku můžete poslat pull nebo požádat a já se na to podívám.

Editoval Antik (4. 2. 2016 12:35)

Jan Mikeš
Člen | 771
+
0
-

Ahoj, zkusil jsem použít nový, přepsaný doplňek, při použití setRequired() na controlu při editaci nepustí bez vybrání nového obrázku. Nejsem si teď jist, ale mám pocit, že u předchozí verze pokud bylo nastaveno setRequired() a nebyl označen checkbox na smazání, tak nebylo potřeba uploadovat nový obrázek.

Momentálně řeším tak, že kontroluji pokud entita nemá property s cestou k obrázku NULL tak setRequired() nenastavuji.

Docela mi dává smysl, pokud vyžaduji obrázek, tak stačí, aby tam vždy nějaký byl, takže při editaci pokud obrázek nechci přehrát, tak ponechat stávající.

edit: zároveň, pokud je obrázek vyžadován, asi bych nevykresloval checkbox pro smazání, pro běžné uživatele to může být trošku matoucí

Editoval Lexi (3. 2. 2016 23:45)

Martk
Člen | 656
+
+1
-

@Lexi Byla to chyba, která už je opravena. Checkbox je odstraněn u povinné položky, díky.

Jan Mikeš
Člen | 771
+
0
-

@Antik parada, fix funguje, diky za to! Jeste napad, pokud neni input oznacen jako required, klidne bych tam nechal ten upload control, stejne jako je to v pripade ze je povinny, takhle musis obrazek nejdrive smazat, aby jsi jej mohl znovu uploadnout.

Btw mas v planu implementovat zase client side skripty, stejne jako tomu bylo u predchozi verze + nejake demo nebo dokumentace k tomu? Delsi dobu zvazuju, ze udelam multipleupload a pokud by s tim umel doplnek nejak pracovat uz v zakladu bylo by to bozi :-)

Martk
Člen | 656
+
0
-

V dev verzi je to zahrnuto. Zatím to neumí replikaci.

flamengo
Člen | 131
+
0
-

Bohužel composer mi doplněk nenainstaluje :(

composer require webchemistry\images
  [InvalidArgumentException]
  Could not find package webchemistry\images at any version for your minimum-
  stability (stable). Check the package spelling or your minimum-stability


require [--dev] [--prefer-source] [--prefer-dist] [--no-progress] [--no-update]
[--update-no-dev] [--update-with-dependencies] [--ignore-platform-reqs] [--sort-
packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--] [<packag
es>]...

Nette 2.4 (asi, instalace dle dokumentace 2.4). Jen tak mimo téma, jak zjistím verzi Nette?

CZechBoY
Člen | 3608
+
0
-

@flamengo v composer.lock máš u všech balíčků uvedené nainstalované verze.

Martk
Člen | 656
+
0
-

@flamengo V readme jsem nechtěně dal zpětné lomítko, správně mělo být: composer require webchemistry/images.

Pro nette 2.4 formuláře bych nepoužíval addImageUpload, obsahuje chybu, kterou brzo opravím.

Editoval Antik (29. 6. 2016 15:06)

flamengo
Člen | 131
+
0
-

@CZechBoY díky díky. Tak asi verze 2.3 to vypadá.

@Antik díky díky, toho jsem si vůbec nevšiml :)

Martk
Člen | 656
+
0
-

@flamengo Na zjištění verzí nainstalovaných balíčku je vhodný příkaz: composer show , pro starší verze composer composer show –installed

flamengo
Člen | 131
+
0
-

@Antik

Mám pár dotazů:

1/ Při pokusu o:

$form->addImageUpload('upload', 'Upload')
	->setNamespace('namespace');

Fatal Error Class ‚WebChemistry\Images\Helpers\Quality‘ not found

File: ...\vendor\webchemistry\images\src\AbstractStorage.php:40
37:        private function extractHelpers(array $helpers) {
38:            foreach ($helpers as $name => $class) {
39:                if (!is_object($class)) {
40:                    $helpers[$name] = new $class;

Bohužel 'WebChemistry\Images\Helpers\Quality ani nic podobného jsme ve zdrojácích nenašel :(

2/ Metoda addMultiImageUpload() je pro hromadný upload pouze obrázků, nebo umí i ostatní soubory (např. PDF)?

3/ Je někde k dispozici funkční demo?

4/ Jen taková poznámka. V dokumentaci je u konfigurace uvedeno image, ale zřejmě by tam mělo být images.

Předem díky za reakce.

Editoval flamengo (30. 6. 2016 10:55)

Martk
Člen | 656
+
0
-
  1. Aktualizoval bych na verzi 2.1.3 . Helper quality je deprecated.
  2. Jenom pro obrázky a využívá jen atributu multiple. Pokud chceš použít multiupload jiných souborů, tak můžeš použít druhý UploadControl v nette a nastavit třetí atribut addUpload na TRUE. Pokud chceš replikaci inputů, tak můžeš použít: kdyby/replicator nebo webchemistry/forms-multiplier
  3. Funkční demo není k dispozici.
  4. Ano, je to tak. Dokumentaci moc často neaktualizuji, budu rád když pošleš PR.
flamengo
Člen | 131
+
0
-

Ahoj, jak nastavím svůj název obrázku?

Zkusil jsem dle příspěvku výše:

$savedImage = $this->imageStorage->saveUpload($values->image, $this->img_namespace.'/'.$id);
$savedImage->setName($newFilename);
$savedImage->save();

a

Fatal Error
Call to a member function setName() on string

Najdu někde nějaká best practice nebo nějaký ukázkový kód, či seznam možností?
Předem díky za reakci.

Editoval flamengo (5. 8. 2016 20:01)

Martk
Člen | 656
+
0
-

@flamengo Ahoj, nevím jakou používáš verzi, ale v nejnovější stable verzi je jako poslední parameter callback.

$this->imageStorage->saveUpload($values->image, $this->img_namespace.'/'.$id, function ($image) {
	$image->setName($newFilename);
});
// tady nic neukládat, uloží se to v metodě saveUpload

Editoval Antik (5. 8. 2016 20:41)

flamengo
Člen | 131
+
0
-

Používám webchemistry/images 2.1.4

Uvedený kód jsme pouze zkopíroval a výsledek :(

Notice
Undefined property: Nette\Utils\ArrayHash::$image

218: $this->imageStorage->saveUpload($values->image, $this->img_namespace.‚/‘.$id, function ($image) {
219: $image->setName($newFilename);
220: });

Uvádím větší kus kódu (zjednodušený):

protected function createComponentForm(){
	$form = new MyForm;
	$form->setTranslator($this->translator);
	$form->addText('name', 'forms.inputs.name')
		->setRequired('forms.rules.filled');
	$form->addUpload('image', 'forms.inputs.img')
	    ->setRequired('forms.rules.filled')
		->addRule(MyForm::IMAGE, 'forms.rules.image');
	$form->addSubmit('send', 'admin.btn_add');
	$form->onSuccess[] = array($this, 'processAddForm');
	return $form;
}

public function processAddForm(MyForm $form){
	$values = $form->getValues();
	$valuesOriginal = clone $values;
	unset($values['image']);
	$id = $this->model->insert($values);

	$newFilename = $values['name'];
	$this->imageStorage->saveUpload($values->image, $this->img_namespace.'/'.$id, function ($image) {
	  $image->setName($newFilename);
	});

    $this->flashMessage($this->translator->translate('admin.msg.add_success'), 'info');
}

Editoval flamengo (7. 8. 2016 15:23)

Martk
Člen | 656
+
0
-

V tomto kódu zrušíš index image a potom k němu přistupuješ:

public function processAddForm(MyForm $form){
    $values = $form->getValues();

	$newFilename = $values['name'];
	$this->imageStorage->saveUpload($values->image, $this->img_namespace.'/'.$id, function ($image) use ($newFilename) {
      $image->setName($newFilename);
    });

    $valuesOriginal = clone $values;
    unset($values['image']);
    $id = $this->model->insert($values);

    $this->flashMessage($this->translator->translate('admin.msg.add_success'), 'info');
}

Můžu se zeptat jak potom získáváš obrázek?

flamengo
Člen | 131
+
0
-

S tou chybou jsi měl samozřejmě pravdu, měl jsem tam záměnu $valuesOriginal a $values, díky.

Takže jsem se dostal o kousek dál a opět jsme narazil :(

Ano, jak získám ten obrázek, to bych taky potřeboval vědět.
Původní představa byla, že v editačním formuláři se zobrazí náhled obrázku nějak takto:

$form->addUpload('image', 'forms.inputs.img')
	->setRequired('forms.rules.filled')
	->  // další kód
if($this->getParam('id') && !is_null($this->item->img)){
	$form['image']->setOption('description', Html::el('img')->src($this->item->img)->class('preview'));
}

Takže jsem narazil na to, ja kvůbec vytvořit obrázek bez použití latte a makra.

Našel jsem toto: https://forum.nette.org/…imagestorage#…

$this->imageStorage->create($this->item->img, '200x300', 'flag')
->setNoImage(NULL) // Nebude se generovat no image
->createLink(); // Generace zmenšeného obrázku a vrácení cesty

Fatal Error
Call to undefined method WebChemistry\Images\FileStorage\FileStorage::create()

Dále jsme zkusil toto:

$this->imageStorage->get($this->item->img, '200x200');

Čekal jsem, že v případě, že obrázek o zadané velikosti neexistuje, že se vytvoří. Nestalo se tak. Takže ani toto nemohu použít.

Takže mám pár dotazů:

  1. Jak vytvořim tak banální věc, jako je náhled vloženého obrázku a to dřív, než v latte šabloně?
  2. Lze z něčeho takovéhoto $this->imageStorage->get($this->item->img, '200x200'); získat relativní adresu obrázku a absolutní adresu?
  3. Pokud smažu obrázek $this->imageStorage->delete($this->item->img);, lze nějak nastavit, aby se smazaly i prázdné složky, které zůstanou po obrázku?
  4. (EDIT) Lze obrázky nějak přejmenovat, přesunout, zkopírovat?

Předem díky za odpovědi.
PS: Používám Nette 2.4

Editoval flamengo (8. 8. 2016 17:40)

Martk
Člen | 656
+
0
-

Na nahrávání ti doporučuji použít tuto komponentu pro formuláře, registruje se sám k formulářům, nezakážeš-li to v konfiguračním souboru. Řeší jak odstraňování, tak i nahrávání a náhled obrázků.

$form->addImageUpload('image', 'forms.inputs.img')
	->setRequired('forms.rules.filled')
	->setNamespace($this->img_namespace)
	->onBeforeSave[] = function ($image) use ($form) {
		$image->setName($form['name']->getValue());
	};

V processAddForm metodě již nemusíš nic řešit a uložit vrácenou hodnotu z klíče image. Bude obsahovat string nebo NULL, v případě povinného pole jenom string.

2. $this->imageStorage->get($this->item->img, '200x200') získáš jen třídu pro tento obrázek, link potom $this->imageStorage->get($this->item->img, '200x200')->getLink(), obsahuje url adresu i s basePath.

3. Hodím to do masteru.

Když chceš ukládat jméno obrázku, tak doporučuji to dělat takto:

$image = $this->imageStorage->saveUpload($values->image, $this->img_namespace.'/'.$id, function ($image) use ($newFilename) {
      $image->setName($newFilename);
});

$imageName = (string) $image;

protože, existuje-li obrázek se stejným názvem, tak se udělá prefix a navíc potom můžeš snadno získat obrázek:

$link = $this->imageStorage->get($imageName)->getLink();

Měl bych si asi sednou a napsat pořádnou dokumentaci.

flamengo
Člen | 131
+
0
-

Na nahrávání ti doporučuji použít tuto komponentu pro formuláře, registruje se sám k formulářům, nezakážeš-li to v konfiguračním souboru. Řeší jak odstraňování, tak i nahrávání a náhled obrázků.

Komponentu WebChemistry\Images\Controls\Upload jsem testoval a poté jsem se rozhodl ji nepoužít:

  1. V okamžiku, kdy nahrávám soubor, neznám ještě ID vloženého záznamu, který používám pro název složky, do které obrázek potřebuji umístit. Komponenta soubor uloží hned a až potom vložím data do databáze. Zde by se to dalo vyřešit nějakým rename() či move(), má/nemá?
  2. Zobrazí náhled? Prosím o příklad. Tak nějak jsem to dle tohoto vlákna pochopil, že by to mělo něco zobrazit, ale při hokusech pokusech se mi to ani jednou nepovedlo.
  3. Mám vlastní render na formuláře, kde si vkládám u povinných položek červenou hvězdičku: $this->wrappers['label']['requiredsuffix'] = Html::el('span')->class('required text-danger')->setText(' *')->title('vyžadováno'); U tvého control prvku toto nefunguje.
$form->addImageUpload('image', 'forms.inputs.img')
    ->setRequired('forms.rules.filled')
    ->setNamespace($this->img_namespace)
    ->onBeforeSave[] = function ($image) use ($form) {
        $image->setName($form['name']->getValue());
    };

Použil jsem přesné znění kódu a:
Nette\MemberAccessException
Call to undefined method Nette\Utils\Image::setName().

Tak a zpět k dotazům.

  1. Jak mohu vytvářet obrázky bez zavolání makra v šabloně ???
  2. Lze obrázky nějak přejmenovat, přesunout, zkopírovat?

A jinak díky moc za trpělivost.

Editoval flamengo (8. 8. 2016 18:56)

Martk
Člen | 656
+
0
-

Omlouvám se, zapomněl jsem, že se v tomto eventu předává Nette\Utils\Image, v devu už jsou na to 2 eventy a přejmenoval jsem onBeforeSave (deprecated) na onUpload.

1. Tak v tom případě je opravdu nejlepší si udělat vlastní upload. Jen si dávej pozor, zda obrázek existuje, jinak se doplní název obrázku o prefix.

2.

$form->addImageUpload('image')
	->setDefaultValue('namespace/image.jpg'); // Musí existovat obrázek

3. Tohle jsem nikdy nepotřeboval, ještě prozkoumám.


1.

$image = $imageStorage->get($fullName, '200x100')->getLink(); // Vytvoří a vrátí link na obrázek

2. Pohodlně ne, udělám ve verzi 2.3:

$original = $imageStorage->get($fullName);
$copy = $original->copy('copy_namespace/copy_name.jpg');
$move = $original->move('move_namespace/move_name.jpg'); // přejmenování a přesunutí je v podstatě stejná věc
flamengo
Člen | 131
+
0
-

@Antik Díky za trpělivost, nyní již funguje. Bez možnosti změnit název se zatím obejdu.

flamengo
Člen | 131
+
0
-

@Antik Ahoj, dosti začátečnická otázka, ale jak dostanu imageStorage do komponenty?
Pokud mám formulář v presenteru, tak vše funguje, Chci si trochu pročistit presentery a tak přesouvám formuláře do komponent.

class Form extends Control{

	use \WebChemistry\Images\TPresenter;

	public function render(){
		dump($this->imageStorage);
	}
}

Zobrazí NULL. Jat to tam prosím dostat? Díky.

Jan Mikeš
Člen | 771
+
+1
-

@flamengo klasicky jako kazdou jinou sluzbu zaregistrovanou v DIC, pres constructor nebo inject metodu.

(https://github.com/…resenter.php – pravdepodobne nemas na te komponente povolene injecty)

Editoval Lexi (23. 8. 2016 18:00)

flamengo
Člen | 131
+
0
-

@Lexi Dík, to jsem tak nějak věděl. Jen jsem nevěděl, kterou třídu, ale pak mě to trklo :)

use Nette\Application\UI\Control,
	WebChemistry\Images\AbstractStorage;

class Form extends Control{

	/** @var WebChemistry\Images\AbstractStorage */
	private $imageStorage;

	/**
	 * @param AbstractStorage $imageStorage
	 */
	public function __construct(AbstractStorage $imageStorage){
		parent::__construct();
		$this->imageStorage = $imageStorage;
	}
}
Martk
Člen | 656
+
0
-

Připravují teď verzi 3.0 (podpora pro cloudinary bude a je implementována) a mám jedno dilema, nastíním:

v nynější verzi se upravuje obrázek krkolomně:

$storage->saveUpload($fileUpload, 'namespace', function ($image) {
	$image->setWidth(100);
	// ...
});

v nové verzi to půjde přes modifikátory (latte syntax), bude možnost napsat jednoduše vlastní.

$res = $storage->createUploadResource($fileUpload);
$res->setNamespace('namespace');
$res->parse('resize:100,200,exact|sharpen');
$result = $storage->save($res);

$result->parse('baseUri');
echo $storage->link($result);

Problém je v tom, že u lokálního úložiště se bude nejspíše vytvářet složka s hashem ⇒ nepřehlednost. Takže jsem zavedl aliasy, které se převedou na modifikátory např.:
konfigurace:

images:
	local:
		aliases:
			thumb: 'resize:20,20,exact'

použití:

$storage->parse('@thumb');

Vytvoří se složka s názvem thumb bez hash, pokud se změní hodnota aliasu, tak se jednoduše smaže složka a vše se nahraje znova.

A teď to dilema:

  1. Zakázat modifikátory a používat jen aliasy. (aliasy se budou možná hodně množit)
  2. Používat modifikátory a aliasy:

ukázka:

$storage->parse('@thumb|crop:10,10,10,10');

Problém č.1: upřednostňovat alias nebo modifikátor?
Problém č.2: složka se bude generovat jako thumb-s4d545sf45f4s

  1. Nekombinovat aliasy a modifikátory.
  2. Nepoužívat aliasy.

Editoval Antik (25. 8. 2016 15:15)

Landsman
Člen | 152
+
0
-

@Antik Jak řešíš thumbs, které se nepoužívají? V jednom CMS, které jsem používal bylo skvělé řešení pro údržbu, která cronem zjišťovala poslední použití miniatury a pokud překročil datum nastavený interval, smazala ji. Všechny miniatury byly tedy v jedné složce, ale nenarazil jsem na potřebu to měnit / řešit.

Jinak koukám super rozšíření, používám něco vlastního, ale brzy asi přejdu! :)

Martk
Člen | 656
+
0
-

Zatím jsem neřešil, protože jsem to nemusel, ale byl jsem jednou odhodlán napsat kód a taky jsem napsal na cleaner, který by toto řešil na stejném principu (mazání obrázku starší než měsíc, zachování např. 5 nejnovějších obrázků, mazání obrázku u kterých byl přístup větší než měsíc), ale už jsem ho nenašel, tak ho někdy napíšu znova :). Potom jsem zaznamenal problém, kdy jsem generoval např. pro produkty miniatury o určité velikosti s helpery, změnil se design a musel jsem všude měnit ty velikosti a mazat složité názvy složek pro invalidaci, tohle by měli řešit aliasy popsaný o 2 příspěvky výše.

Landsman
Člen | 152
+
0
-

Antik napsal(a):

Zatím jsem neřešil, protože jsem to nemusel, ale byl jsem jednou odhodlán napsat kód a taky jsem napsal na cleaner, který by toto řešil na stejném principu (mazání obrázku starší než měsíc, zachování např. 5 nejnovějších obrázků, mazání obrázku u kterých byl přístup větší než měsíc), ale už jsem ho nenašel, tak ho někdy napíšu znova :). Potom jsem zaznamenal problém, kdy jsem generoval např. pro produkty miniatury o určité velikosti s helpery, změnil se design a musel jsem všude měnit ty velikosti a mazat složité názvy složek pro invalidaci, tohle by měli řešit aliasy popsaný o 2 příspěvky výše.

Aha, to zní dobře! Tzn. že by jsi přegeneroval miniatury pouze konkrétních položek a nemusel přegenerovávat vše (tak to řeší většina lidí ve wordpressu a vždy mi to přišlo hloupé).

mordare
Začátečník | 117
+
0
-

Zdravím. Dělám update projektu na Nette 2.4 a dělám update i všech knihoven včetně ImageStorage.
Přesněji sem přešel na verzi 2.2

Akorát teď když použiju Traitu tak mi začne laděnka házet tuto chybu:

Service of type WebChemistry\Images\AbstractStorage used in @var annotation at WebChemistry\Images\TPresenter::$imageStorage not found. Did you register it in configuration file?

Edit: ve chvíli kdy sem dal do Traity jako @inject IImageStorage tak to jede OK

Editoval mordare (15. 9. 2016 13:00)

erikbalog
Člen | 27
+
0
-

zdravím, používam tento doplnok a obrázky ukladám takto:

<?php
           $this->imageStorage->saveUpload($values->poster, 'poster', function (\WebChemistry\Images\FileStorage\Image\Image $image) {
                $image->setNameWithoutSuffix($this->movie->getId());
                $image->setSuffix('jpg');
            });
?>

uloží sa pod názvom id.jpg napr. 1.jpg .. ale keď obrázok chcem nahradiť tak sa neprepíše súbor 1.jpg ale vytvorí sa nový vi26kotfq5_._1.jpg, neviete mi poradiť? nedokážem na to prísť

Ďakujem

Editoval erikbalog (26. 11. 2016 20:12)

Martk
Člen | 656
+
0
-

@erikbalog Budeš muset udělat toto:

<?php
		   $this->imageStorage->delete($this->movie->getId() . '.jpg');
           $this->imageStorage->saveUpload($values->poster, 'poster', function (\WebChemistry\Images\FileStorage\Image\Image $image) {
                $image->setNameWithoutSuffix($this->movie->getId());
                $image->setSuffix('jpg');
            });
?>
Martk
Člen | 656
+
+1
-

Verze 3.0 beta

Po dlouhé době jsem se dokopal dodělat dlouho rozdělanou verzi. Beta verze proto, že musím ještě otestovat a dodělat podporu pro cloudinary.

Změny

  • Obrázky jsou nyní objekty. 2 základní typy, jeden reprezentuje již nahraný obrázek, druhý obrázek připravený k nahrání.
  • Složitější úpravy obrázků
  • Obrázky se nadále upravují jen přes předem definované aliasy ⇒ rychlejší a přehlednější
  • V modifikátorech lze použít pole
  • Před nahráním originálního obrázku jde upravit obrázek aliasem, obrázek se uloží do složky original
  • Nové funkce copy, move, save
  • Funkce delete odstraňuje prázdné složky
  • Podpora cloudinary
  • Typ „image“ pro doctrine
  • Komponenta UploadControl umí jen převádět obrázek na objekt

Budu rád za každé nahlášení chyby nebo návrh ke zlepšení, před vydáním ostré verze.

Jan Mikeš
Člen | 771
+
+1
-

Obrázky se nadále upravují jen přes předem definované aliasy ⇒ rychlejší a přehlednější

Toto jsem jednu dobu používal ve svém doplňku a již nikdy více :-) nešla by funkčnost variabilních rozměrů bez potřeby definovat předem alias zachovat?

Typ „image“ pro doctrine

Palec hore!

Komponenta UploadControl umí jen převádět obrázek na objekt

Co to přesně znamená? Bude potřeba ve handlerech formulářů obrázek uploadovat, případně na něm volat ->save()?

Martk
Člen | 656
+
0
-

Změna rozměrů bez aliasu by šla udělat. Proč jsi to nesnášel? Možná je to špatný nápad a to mi pomůže nad tím popřemýšlet a možná vymyslet alternativní cestu.

Jen volat save, příklad v dokumentaci.

Jan Mikeš
Člen | 771
+
0
-

Dokáži si živě vybavit 2 situace, kdy mě to vyloženě sralo :-)

  1. Dopředu jsem na projektu nikdy nevěděl, jak fotka bude přesně velká, když jsem to zjistil, musel jsem jít a nadefinovat si velikost miniatury, jejich počet narůstal a nepořádek byl veliký, chtěl jsem přijít, zadat rozměry obrázku a fungovat. Rrozměry jsem měl často uložené i v databázi, takže jsem je měl v proměnné – tato situace je neřešitelná, pokud je potřeba si definovat aliasy.
  2. Na projektu kde pracuje více lidí a časem aliasů přibývá, nepozorný programátor přidává nový typ miniatury s rozměry, které jsou již definovány, s jiným názvem a vzniká chaous.