Manipulace s obrázky [Nový ImageStorage]
- flexroad
- Člen | 117
Ahoj,
po update na nette 2.3.0 chyba NA TOMTO RADKU
Undefined variable: builder
staci prepsat na:
$config['wwwDir'] = Nette\DI\Helpers::expand($config['wwwDir'], $this->getContainerBuilder()->parameters);
Da se s tim neco udelat?
EDIT:
Uz jsem udelal fork!
Diky,
@flexroad
Editoval flexroad (2. 3. 2015 13:12)
- Pavel Janda
- Člen | 977
@Antik Webchemistry vůbec nějak na Nette 2.3 nefunguje.
Při uploadu:
Fatal Error
Call to a member function isImage() on string
Source file:
/**
318: * Is file image?
319: * @return bool
320: */
321: public static function validateImage(Controls\UploadControl $control)
322: {
323: foreach (static::toArray($control->getValue()) as $file) {
!!324: if (!$file->isImage()) {
325: return FALSE;
326: }
327: }
328: return TRUE;
Ve Nette verzi 2.2.7 se tato metoda vůbec nevolala, tolik info.
Editoval Beton (6. 3. 2015 14:07)
- Martk
- Člen | 661
Verze 1.3
- Přidán MultiUpload (Vyžaduje Kdyby Replicator)
- Přidána podpora pro Texy!
- Přidána crop funkce v makrech.
- Automatická registrace formulářových prvků v DI kontejneru. Nastavit lze v configu.
- Odstraněny některé chyby.
Ukázka obrázku v Texy:
[img namespace/image.png, 200x100, exact]:(alt = Popis obrázku, class = img-responsive img-circle)
Ukázka použití crop v makru:
<img n:img="'namespace/image.png', 'crop(50%,20,100%,500)'">
<img n:img="'namespace/image.png', 'crop(100,20,200,500)'">
- papajda
- Člen | 6
Ahoj,
při uploadu mi nefungujou validační pravidla (nette 2.3)
Call to a member function getSize() on a non-object
243: /**
244: * Is file size in limit?
245: * @return bool
246: */
247: public static function validateFileSize(Controls\UploadControl $control, $limit) {
248: foreach (static::toArray($control->getValue()) as $file) {
249: if ($file->getSize() > $limit || $file->getError() === UPLOAD_ERR_INI_SIZE) {
250: return FALSE;
251: }
252: }
253: return TRUE;
- Pavel Janda
- Člen | 977
Zdravím,
není možné určit kvalitu komprimace při zmenšování obrázku. Docela se mi nelíbí, že se defaultně používá 80% komprese, která je ještě nastavená skrze Nette/Utils/Image.
Edit:
Pošlu klidně pull-request, jakmile to dokážu rozchodit na Nette 2.3,
bohužel to zatím chcípá.
Editoval Beton (25. 3. 2015 15:01)
- flexroad
- Člen | 117
Ahoj,
poradi nekdo jak pouzit routu s namespace?
Kdyz zavolam
http://www.mujserver.lc/…00x300/exact
hodi mi chybu tento radek:
Call to a member function isImageExists() on a non-object
muj neon:
images:
wwwDir: %wwwDir%
assetsDir: ‚uploads‘
noimage: ‚noimage/noimage.png‘
settings:
upload:
label: ‚Delete this image?‘
router:
mask:
„show-image/<namespace>/<name>[/<size>[/<flag>[/<noimage>]]]“
resize: no # Disallow create resized image
flag: 0
disable: no
Diky,
@flexroad
Editoval flexroad (2. 4. 2015 13:51)
- Martk
- Člen | 661
parameter namespace v routě neexistuje. Parameter name je absolutní jméno pro obrázek tzn. namespace + jméno obrázku. Lomítka a tečky jsou nahrazené za dovojtečky (může se změnit), kvůli .htaccess (lze k tomu použit funkce WebChemistry\Images\Router\Helper::encodeName).
Takže url by měla vypadat
http://www.mujserver.lc/show-image/news:mujobrazek:png/1200x300/exact
a maska routy:
show-image/<name>[/<size>[/<flag>[/<noimage>]]]
- flexroad
- Člen | 117
Antik napsal(a):
parameter namespace v routě neexistuje. Parameter name je absolutní jméno pro obrázek tzn. namespace + jméno obrázku. Lomítka a tečky jsou nahrazené za dovojtečky (může se změnit), kvůli .htaccess (lze k tomu použit funkce WebChemistry\Images\Router\Helper::encodeName).
Takže url by měla vypadat
http://www.mujserver.lc/show-image/news:mujobrazek:png/1200x300/exact
a maska routy:
show-image/<name>[/<size>[/<flag>[/<noimage>]]]
Super. Krasne a ciste reseni. To mam rad.
Diky MOC!
- flexroad
- Člen | 117
Ahoj,
narazil jsem na VELMI zvlastni chybu…pri pokusu zobrazit dve ruzne velikosti vygenerovanych nahledu…
Takto si nahraju obrazky a vygeneruju dve potrebne velikosti nahledu:
$upload = $this->imageStorage->fromUpload($fileUpload, 'profiles');
$name = $upload->save();
$superSmallPicturePath = $this->imageStorage->create($name, '70x70', 'exact')->createLink();
$smallPicturePath = $this->imageStorage->create($name, '150x150', 'exact')->createLink();
Pokud potom otevru url: „/show-image/profiles:123:jpg/70×70/exact“
, obrazek se sice v prohlizeci zobrazi, ale v konzoli vidim error 500 a
v logu vidim,
Page not found. Missing template
‚…\vendor\webchemistry\images\src\templates\Generate\default.latte‘
Pokud ale otevru url: „/show-image/profiles:123:jpg/150×150/exact“, vse se zobrazi bez chyby a v poradku…
No toto proste NECHAPU!!!
Nejake napady?
@flexroad
/show-image/profiles:123:jpg/150×150/
- flexroad
- Člen | 117
Ahoj,
poradi mi nekdo prosim, jak otevrit existujici obrazek ulozeny v namespace „test“?
Zkousim metodu fromContent(), ale nemuzu prijit na to co ji predat, aby to vratilo kyzeny obrazek.
Obrazek ukladam takto:
$fileUpload = new FileUpload([
'name' => $filename,
'type' => $type,
'tmp_name' => $tmp_name,
'size' => $size,
'error' => $error,
]);
$upload = $this->imageStorage->fromUpload($fileUpload, 'test');
$name = $upload->save();
coz ulozi ve slozce „upload/test/original“ muj nahravany soubor.
Otevrit soubor se snazim takto:
$obrazek = $imageStorage->fromContent(‚obrazek.jpg‘, ‚obrazek.jpg‘,
‚test‘);
Objekt obrazek ale neobsahuje zadne informace o obrazku, jako treba vysku, sirku…atd.
Diky za cokoliv!!!
@flexroad
- Martk
- Člen | 661
@flexroad Myslím, že potřebuješ toto:
/** @var WebChemistry\Images\Image\Image $image */
$image = $this->imageStorage->create('test/obrazek.jpg');
/** @var WebChemistry\Images\Image\Info $info */
$info = $image->createImageInfo();
V nejbližší době budu trošku upravovat tuto komponentu a přejmenuji některé funkce (Staré budou deprecated)
- flexroad
- Člen | 117
Ahoj,
zase ja. Resim orezavani obrazku v prezenteru. Mam problem, pokud potrebuju obrazku zmenit velikost a zaroven nastavit pozici crop.
Dejme tomu, ze obrazek ma v originalu 500×1000px
Potrbeuju zmenit na obrazek o velikosti 200×100 a crop ramecek nastavit uplne nahoru doleva misto soucasneho stredu.
Zkousel jsem
$image = $this->imageStorage->create('test/'.$imageName);
$image->setWidth(200); // nic neudela :(
$cropped = $image->setSize("crop(0,0,200,100)")->createLink();
Ale obrazek se jen orizne bez zmenseni – ja bych ho ale potreboval jeste pred orezem resiznout na kyzenych 200px na sirku.
Poradi nekdo?
@flexroad
- flexroad
- Člen | 117
flexroad napsal(a):
Ahoj,
zase ja. Resim orezavani obrazku v prezenteru. Mam problem, pokud potrebuju obrazku zmenit velikost a zaroven nastavit pozici crop.
Dejme tomu, ze obrazek ma v originalu 500×1000px
Potrbeuju zmenit na obrazek o velikosti 200×100 a crop ramecek nastavit uplne nahoru doleva misto soucasneho stredu.
Zkousel jsem
$image = $this->imageStorage->create('test/'.$imageName); $image->setWidth(200); // nic neudela :( $cropped = $image->setSize("crop(0,0,200,100)")->createLink();
Ale obrazek se jen orizne bez zmenseni – ja bych ho ale potreboval jeste pred orezem resiznout na kyzenych 200px na sirku.
Poradi nekdo?
@flexroad
Nejake napady? Nebo se mam pustit do prepisovani?
- Martk
- Člen | 661
Do doby než dodělám tu novou verzi, tak by mělo pomoc přepsání z else if na if. (Bohužel se nevytvoří složka x200-crop*, ale jenom crop*)
https://github.com/…ge/Image.php#L46
Editoval Antik (28. 5. 2015 9:45)
- Martk
- Člen | 661
@flexroad Momentálně jsem vydal novou verzi. Obsahuje syntaxi helperů jako v latte.
Pro tvůj účel:
$imageStorage->getLink('test/'.$imageName, '200x100|crop:0,0,200,100'));
Lze aplikovat vlastní helpery a více helperů najednou. Obsah základních helperů je tady: https://github.com/…n/HELPERS.md
- flexroad
- Člen | 117
@Antik : Zatim vsechno slape jak ma krome jedne veci… Jen nevim, jestli to je bug, nebo jestli neco delam spatne.
Pokud neexistuje obrazek, zobrazi se misto nej /uploads/noimage/original/noimage.png a to i kdyz po nem chci nejakou konkretni velikost, napriklad:
{img 'profiles/neexistujiciobrazek.jpg', '70x70', 'exact'}
Delam neco spatne? V puvodni verzi to noimage.png v pohode resizovalo.
Diky,
@flexroad
Editoval flexroad (3. 6. 2015 14:13)
- Jan Mikeš
- Člen | 771
@Antik lze nějak jednoduše upravit velikost náhledu, která se
automaticky generuje při použití $form->addImageUpload()
? Ono
asi není úplně žádoucí, aby se mi zobrazovaly fotky v plném rozlišení
přímo ve formuláři :).
Dívál jsem se do implementace, a asi to vyřeším přes css max-height na
třídu upload-preview-image
ale nezdá se mi to jako nejlepší
řešení.
Osobně bych navrhoval přidat setter setPreviewDimensions()
nebo setPreviewSize()
.
Implementace by neměla být složitá, pokud chceš mohl bych zkusit nachystat PR.
Jinak fakt výborný doplněk a od jeho nejistých začátků, kdy měl spoustu chyb a nedokonalostí ušel dlouhou cestu!!
- Jan Mikeš
- Člen | 771
@Antik při tomto kódu
$form->addImageUpload("image", "Fotografie")
->setDefaultValue($contact->image)
->setNamespace("contact");
Uploadnu img (ten se uploadne správně) do složky contact/original, ale dostávám špatnou value z formu:
public function process($form, $values)
{
var_dump($values);
$stop();
Nette\Utils\ArrayHash #0129
image => "contactupload.jpg"
Chybí tam lomítko, jedná se o bug nebo špatné použití u mě? Jakmile v DB upravim záznam (to lomítko tam přidám) tak je to ok
- Martk
- Člen | 661
@flexroad Díky moc! Opraveno a přidány testy.
@Lexi Mě to bohatě stačilo, protože jsem nastavil rezponzivní obrázek a max-width, takže obrázek nebyl příliš velký, nepřesahoval obrazovku a navíc jsem na to už nemusel znova šáhnout. Ale myslím, že nastavení požadované velikosti by nebylo úplně naškodu.
Tohle chování by nemělo být, podívám se na to a v nejbližší době pošlu commit.
Jinak díky, ale ještě tento projde řadou změn. Překopání doplňků + přidání testů a vytvořit konektory pro online úložiště.
Editoval Antik (5. 6. 2015 9:27)
- Jan Mikeš
- Člen | 771
@Antik ještě jednu chybičku jsem našel, v dokumentaci je 2× uveden příklad s tímto pořadí parametrů:
$form->addImageUpload('upload2', 'Upload 2', $row->upload, 'namespace');
Ve skutečnosti ale jsou parametry image a namespace naopak, takže pokud
člověk nevyužívá metody setDefaultValue()
a
setNamespace()
tak to může zamotat hlavu ;)
- Jan Mikeš
- Člen | 771
@Antik díky moc, skvělá práce! Šlo by ještě aktualizovat composer? https://packagist.org/…istry/images dev-master ukazuje stejný commit jako 1.4
- jakub.barta
- Člen | 10
Zdravim a diky za skvely addon, hodne mi ulehcil praci.
Jedina drobnost, ktera mi ztrpcovala zivot, byla ta, ze si v presenteru, ktery
ma trait TPresenter a ktery injectuje storage do sablony, nemuzu hrat s metodou
createTemplate(), protoze metoda presenteru by prekryla metodu traitu a tedy by
se nic neinjectnulo.
Vyresil jsem to pres udalost onTemplateCreated, ktera se vola pote, co trait sablonu vytvori.
Na GH jsem poslal PR.
Diky za vyjadreni a pripadny merge, dost mi to pomuze.
- David Matějka
- Moderator | 6445
@jakub.barta metody trait muzes aliasovat: http://php.net/…5.traits.php#…
use TPresenter {
TPresenter::createTemplate as imageCreateTemplate;
}
protected function createTemplate()
{
$template = $this->imageCreateTemplate();
....
}
- Jan Mikeš
- Člen | 771
Pokud někdo používá tento doplněk společně s doctrine, napsal jsem si jednoduchý subscriber pro Kdyby\Events, který smaže obrázek v případě že je použit u entity, která je smazána, použití je pak naprosto triviální:
/**
* @ORM\Column(nullable=true)
* @App\Annotations\Image // Díky této anotaci se při "preRemove" eventu smaže obrázek z disku
*/
protected $image;
Kdyby někdo měl zájem, rád nahodím na github a o řešení se podělím, případně napíšu jednoduchou extension, která by umožnila automatickou instalaci subscriberu atd… jako balíček pro composer
Editoval Lexi (28. 7. 2015 15:59)
- Jan Mikeš
- Člen | 771
@Antik https://github.com/…aticDeletion mělo by z toho být vše zřejmé, přes víkend k tomu dopíšu extension a hodím do composeru ;)