[addon multiplefileupload] MultipleFileUpload – form control
- Matúš Matula
- Člen | 257
Ahoj, tak som sa na par dni ponoril do tajomstiev MFU a upravil @kashpiho verziu pre Nette 2.
- Upravy namespaces
- Aktualizoval som public assets pre vsetky 3 interfacy (plupload, uploadify, swfupload) a adekvatne ich upravil, aby vsetko fungovalo (+ hodil som ich do 1 ‚modulu‘, aby to bolo viac pokope).
- Narazil som na problem s SQLite modelom (pri nahravani viacerych suborov sa stavalo, ze sa niektore neulozili do databazy), s ktorym som nechcel zbytocne stracat cas, tak som pouzil Dibi model.
- K Pluploadu som dorobil HTML4 Fallback a pridal aj slovensku lokalizaciu.
Takze malo by to byt funkcne, keby ste objavili chybu, tak zalozte issue na
githube alebo sa pytajte tu. Ked budem mat cas, tak na to pozriem.
Link: https://github.com/Ciki/MFU
PS: Honzo, dufam, ze nevadi ze som to hodil na github, stiahol som to z tvojho svn, ale pouzivam git. Keby si mal nejake namietky/pripomienky k mojim upravam, daj vediet, poriesime :)
PS2: Postup je popisany v README na githube. Okrem samotneho MFU je tam aj cast z nette sandboxu, to kym sa nenaucim nejako rozumne pouzivat git submoduly alebo nieco podobne (rad si necham poradit)
- Honza Kuchař
- Člen | 1662
:-) Jiste ze mi to nevadi!! Jsem rad, ze je ten kod zivy a je mozne ho pouzivat i se soucasnou verzi Nette. A ze se nasel nadsenec, ktery provedl upravy. Ja si spravu kodu pote rad prevezmu zpet, jakmile prejdu se svymi projekty na Nette 2.0. (safra nejak jste mi s temi verzemi utekli :-) Doufam, ze chapete, ze nemuzu prevest doplnky hned, kdyz jsem z te Dvojky videl akorqt sandbox. ;-)
Ad GIT: S pouzitim neporadim, protoze porad uzivam SVN. Vsak zaskoli-li me nekdo a hlavne popise, jak naonstalovat GIT server na Windows, pak klidne prejdu na GIT. Nechci zdrojaky posilat nekam do cerne diry cloudu. Ted tam mam VisualSVN, ktery se instaluje na klik. :-)
To s tim SQLite je divne. Jsem si jisty, ze jsem to testoval a toto se mi nestavalo. (ostatne toto byl duvod proc jsem tam pridal to SQLite, v ranych verzich se meta informace ukladaly do souboru ze zamku → caste ztraty dat).
PS: Hned jak se dostanu k nejakemu pocitaci s fyzickou klavesnici, pridam to do dokumentace. A asi by h zkusil napsal Davidovi, jestli muze mit pravo editovat stranku vice lidi. (jak se to dela u vecich projektu?
- simPod
- Člen | 383
zdravim, mam 2 dotazy
- musim pouzivat dibi? Normalne pouzivam Nette\Database
- do bootstrapu jsem vlozil
MultipleFileUpload::getUIRegistrator()
->clear()
->register("MFUUIHTML4SingleUpload")
->register("MFUUIPlupload");
MultipleFileUpload::register();
\-- a dostavam `Fatal Error: Class 'InvalidStateException' not found`
zasekne se to na
/--php
191: /**
192: * @return MFUUIRegistrator
193: */
194: public static function getUIRegistrator() {
195: if (!self::$interfaceRegistrator instanceof MFUUIRegistrator) {
196: throw new InvalidStateException("Interface registrator is not instance of MFUUIRegistrator!");
197: }
198: return self::$interfaceRegistrator;
199: }
v \app\controls\MultipleFileUpload\MultipleFileUpload.php
cim to?
diky
- Matúš Matula
- Člen | 257
Ahoj, ak to je dotaz k mojej upravenej verzii, tak
- Ak chces pouzivat NDB, tak si musis pre nu napisat model – nemalo by to byt nic zlozite, staci prepisat ten Dibi model na syntax NDB
- Pouzivas aktualnu verziu? vidim tam minimalne vynimku bez namespace – https://github.com/…leUpload.php#L196
co presne znamena, ze sa zasekne?
- Matúš Matula
- Člen | 257
ad 2) no ja len ze v tom odkaze vyssie som ukazal, ze v aktualnej verzii je ta vynimka s namespaceom a ty ju mas bez neho..takze niekde bude zrada ;)
- simPod
- Člen | 383
aha, hm, tak ja to jdu stahnout znova :) diky
//edit
tak jsem to stahl, nakonfiguroval, ale firebug mi v consoli hazi 2 errory:
TypeError: $("form").livequery is not a function
$("form").livequery("submit",function(e){
MultipleFileUpload.js (line 3)
tu jsem asi vyresil nakopirovanim jquery.livequery.js a pridanim pred
{!=MultipleFileUpload::getHead()}
tohle <script src="{$basePath}/js/jquery.livequery.js" type="text/javascript"></script>
Kazdopadne s touhle error nevim co mam delat. Nejake napady?
ReferenceError: log is not defined
return false;
MFUFallbackController.js (line 61)
diky
- Matúš Matula
- Člen | 257
Treba najst, kde sa vola fcia log
– je to moj alias pre
console.log
a sluzi len na debug ucely, zabudol som to tam…takze
rychly fix je zadefinovat si v global scope funkciu log
alebo
vyhladat v projekte vyskyty tejto fcie a odmazat ich.
Ked budem mat chvilu cas, tak to spravim a aktualizujem github.
- Honza Kuchař
- Člen | 1662
- Až ten model napíšeš, prosím pošli to sem, určitě nejsi jediný, kdo by Nette\Database rád s MFU používal.
- ad. livequery, to je dosti divné, ten kód, který jsi tam vložit, byl
mělo vygenerovat to
{!=MultipleFileUpload::getHead()}
, nedělá-li to, postrádá smysl. Zkrontroluj, co to vlastně vypisuje a jestli to to livequery nehledá někde, kde třeba není. ;-)
- simPod
- Člen | 383
- no, uprimne, stahl jsem https://github.com/…leUpload.php#L196 a po vyreseni chyb s JS to tak nejak zacalo fungovat samo, takze jsem nic neprepisoval. Ono se to ty DB mozna ani nedotkne…
- kontroloval jsem to, ale nebyl tam tak nevim. Jeste se na to doma podivam
- Matúš Matula
- Člen | 257
Ad 1) Pokial si neregistrujes ten Dibi model, tak sa defaultne pouzije SQLite, takze preto ti to mozno fachci..
Ad 2) @Honzo, ono aj v svn sa spolocne .js subory includuju este v @layout, akurat to nie je spomenute v dokumentacii
- Matúš Matula
- Člen | 257
1. osobne som mal problemy s SQLite pri nahravani viacerych suborov (skusal som iba na dev masine) – mrzlo to, resp. sa obcas stracali subory. Ak tento problem nemas, nie je dovod prechadzat na nieco ine.
EDIT: Upravil som README a odstranil volania funkcie log
.
Editoval Matúš Matula (23. 8. 2012 21:39)
- Andrasin
- Člen | 29
Ahoj, snažím se rozchodit tuto komponentu a mám staženou aktuální verzi z githubu od Matúše Matuly. Chodí mi to v pohodě, pokud nahrávám soubory s maximlním součtem velikosti cca 9MB. Jakmile to překročím, po odeslání formuláře se mi v prohlížeči jen zobrazí čistá bílá obrazovka, žádný error. Zkoušel jsem Uploadify a Plupload, klasická verze bez javascriptu při uploadu větším jak 9MB zůstane viset na zpracovávání uploadu do nekonečna…
V PHP mám nastavenou maximální velikost uploadu i velikost postu na 128MB. Je ještě něco co je třeba v php nastavit? Nebo je to něčím jiným? Nebo to může být stejný problém jako je popisovaný nad tímto příspěvkem s SQLite? Vyzkoušel bych dibi, ale celý projekt běží na Nette\Database…
EDIT: Teď jsem ještě zkoušel nahrát 15 souborů, co dali dohromady cca 7MB, stejný problém.
EDIT2: Přepsal jsem si DibiModel na Nette\Database a problém přetrvává i takto, už fakt nevím :/
Editoval Andrasin (17. 9. 2012 15:38)
- Matúš Matula
- Člen | 257
Ten problem, kt. popisujes (biela obrazovka po odoslani) mi sedi presne na situaciu, kedy prekrocis spominany upload limit (post_max_size, upload_max_filesize) – tie ale pises, ze mas nastavene na 128mb, nic ine ma nenapada..
- Andrasin
- Člen | 29
Honza Kuchař: ano log je prázdný. Nastavený je developerský režim, ostatní chyby hlásí v pohodě.
Matúš Matula: zkusím to teda ještě na na webhostingu kde by mělo být taky 128MB limit, možná bude někde chyba v nastavení php u mě a nastavený limit je ignorován, ale když si limity vypíšu pomocí ini_get, vrací je to správně.
- Honza Kuchař
- Člen | 1662
Zkus si nastavit režim produkční, mohlo by to tu hlášku zalogovat do souboru.
To, že je bílá obrazovka, by nemělo být způsobeno překročením limitu, protože překročíš-li limit, skript dostane prázdný POST, ale normálně proběhne…
- Honza Kuchař
- Člen | 1662
PS: Jeden limit je nastavení postu a druhý limit je nastavení maximální velikosti souboru! ;-)
- Andrasin
- Člen | 29
jj to zabralo…
[2012–09–18 23–05–41] Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 6400 bytes) in C:\xampp\htdocs\cms\libs\Nette\common\Image.php:171 @ http://localhost/…/gallery/add?… @@ exception-2012–09–18–23–05–41–7fc81fc7e3429e0536493afea05f53ae.html
Takže nakonec to vůbec nezpůsobuje uploadování ale samotné zpracovávání obrázků třídou Image, které přeteče memory_limit 128MB. S tím už si nějak poradím. Díky za nasměrování.
Editoval Andrasin (18. 9. 2012 23:18)
- Honza Kuchař
- Člen | 1662
Máš-li povolená exec, můžeš použít ImageMagick, který je jistě o mnoho efektivnější. ;-) Ale to už je značný offtopic.
- simPod
- Člen | 383
mám problem s tímhle addonem. tady je můj kód:
//bootstrap.php
//...
dibi::connect(Nette\Environment::getConfig('database'));
MultipleFileUpload::register();
MultipleFileUpload::getUIRegistrator()
->clear()
->register("MFUUIPlupload");
if (class_exists("Dibi", true)) {
MultipleFileUpload::setQueuesModel(new MFUQueuesDibi());
MultipleFileUpload::setLifeTime(3600);
}
//...
//presenter
protected function createComponentImageAddForm() {
$form = new UI\Form;
$form->addMultipleFileUpload('upload', 'Obrázky')
->addRule('MultipleFileUpload::validateFilled', 'Musíte odeslat aspoň jeden soubor')
->addRule('MultipleFileUpload::validateFileSize', 'Súbory jsou dohromady příliš velké. Odešlete je postupně.', 32 * 1024 * 1024);
$form->addSubmit("submit", "Uložit");
$form->onSuccess[] = callback($this, 'imageAddFormSubmitted');
return $form;
}
public function imageAddFormSubmitted($form) {
$values = $form->values;
\Nette\Diagnostics\Debugger::fireLog($values->upload);
}
Vrací se mi hláška „Musíte odeslat aspoň jeden soubor“. Když
validační pravidlo odstraním, $values->upload
je
prázdné array.
Do databáze i do cache to ukládá dočasné soubory, všechny uploady přes plupload proběhnou bez problémů. Kde by mohl být problém? Díky
- Matúš Matula
- Člen | 257
A ked pouzijes klasicku HTML verziu s $form->addUpload() tak sa ti subory odoslu? Ja len, ci to zase nie je problem s odosielanim prilis velkych suborov.. vid komentare vyssie
- simPod
- Člen | 383
tak jsem prisel na to, ze kdyz odeberu radky
if (class_exists("Dibi", true)) {
MultipleFileUpload::setQueuesModel(new MFUQueuesDibi());
MultipleFileUpload::setLifeTime(3600);
}
tak to funguje. Netusi nekdo proc to pres dibi nechce jet?
Dibi je v config.neon nastaveno:
services:
connection:
class: DibiConnection(%database%)
...
development < common:
parameters:
database:
driver: mysql
host: localhost
database: website
user: root
password:
lazy: TRUE
dik
- Honza Kuchař
- Člen | 1662
nevím jak vypadá tvoje databáze, nicméně neuvedeš-li, jaký driver se m pouzít použije se SQLite
- Honza Kuchař
- Člen | 1662
Rozumíš tomu naprosto správně! To je divné, je-li pole prázdné a soubory v cache i v DB jsou, zkus kontrolovat, jak a kde se co děje s queueID, což je číslo fronty. Do ní se ukládají odkazy na odeslané soubory a potom se přes ne zase přijímají. Nejspíš se to číslo po cestě z nějakého důvodu změní, či se neuloží a potom databáze vrátí prázdný výsledek k dotazu na soubory ve frontě X.
(doporučoval bych plugin Logger v doplňcích a logovat přes něj všechny výstupy a vstupy funkcí v modelu MFU, jistě velmi rychle přijdeš na to, kde problém a prosím napiš sem, kde byl, neřeší se to tu poprvé však u mě na localhostu ani na serveru se to neprojevuje)
- xhtmlkoder
- Člen | 15
Ahoj, po dvoudenním hledání Vás prosím o pomoc. Stáhl jsem si MFU od Matůše Matuly a nejsem si jistý, jeslti prostředím nebo proč to zrovna moc nechce fungovat.
Laděnka vyhazuje
Fatal Error
Class 'SQLiteDatabase' not found
konkrétně
File: ...\app\components\MultipleFileUpload\Models\SQLite\MFUQueuesSQLite.php Line: 78
68: $this->query("END TRANSACTION"); 69: }*/ 70: 71: /** 72: * Open SQLite file 73: * @return SQLiteDatabase 74: * @throws InvalidStateException 75: */ 76: function openDB() { 77: 78: if(!($connection = new SQLiteDatabase(self::$databasePath, 0777, $error))) { 79: throw new InvalidStateException("Can't create sqlite database: ".$error); 80: } 81: 82: return $connection;
V Nette jsem teprve sakra silný junior a tak mi jede aplikace na základu sandboxu z tutoriálu (nette 2.0.6., PHP 5.4.4).
Konfigurace je win/xampp.
PDO drivers mysql, sqlite
SQLite Library 3.7.7.1
SQLite3 module version 0.7
SQLite Library 3.7.7.1
načtení v bootstrapu:
MultipleFileUpload::register();
MultipleFileUpload::getUIRegistrator()
->clear()
->register("MFUUIHTML4SingleUpload")
->register("MFUUIPlupload");
// ->register("MFUUISwfupload");
// ->register("MFUUIUploadify");
// Optional step: register driver
// As default driver is used Sqlite driver
// @see https://componette.org/search/?q=multiplefileupload#toc-drivery
// When you want to use other driver use something like this:
if(class_exists("Dibi", true)) {
// dibi is already connected
MultipleFileUpload::setQueuesModel(new MFUQueuesDibi());
MultipleFileUpload::setLifeTime(3600); // 1hour for temporarily uploaded files
}
// Configure and run the application!
$container->application->run();
config.neon
database:
dsn: 'mysql:host=localhost;dbname=test
user: 'root'
password: ''
a samozřejmě v @layout před </head>
{!=MultipleFileUpload::getHead()}
Prosím mohl by mi někdo pomoci?? Už nad tím sedím dva dny :( a nevím, kde ještě bych měl sqlite driver inicializovat.. Děkuji
- Matúš Matula
- Člen | 257
Ahoj, s tou konkretnou chybou ti asi prilis neporadim, ale skus pouzit
namiesto SQLite databazy napr. MySQL a nastavit prislusny QueueModel
v bootstrape (v ukazke, co si postol, sa nastavuje Dibi, ak ju mas
v projekte). Ten moj fork je stavany pre Dibi(MySQL), pretoze s SQLite som mal
prave obcasne problemy.
P.S.: Ak si stahoval z githubu, tak je tam myslim aj sql dump tabulky
files
, kt. treba vytvorit.
- xhtmlkoder
- Člen | 15
Mno, v tom asi pro mě bude zakopaný pes a nepřekonatlený problém. Používám v aplikaci Nette/database od JV, jelikož jsem se to tak naučil v sandboxu. PHP jsem odjakživa psal funkcionálně a objekty se dá se říci učím na nette. Takže to potřebuji napsat driver pro mysqli, který se standartně v sandboxu používá… :( K..D..
- xhtmlkoder
- Člen | 15
Normálně na lokále. Jak jsem psal. stáhnutý balíček xampu pro vidle. Vše mi tady běhá jak na másle. s db mohu upravovat, vytvářet, editovat…
- xhtmlkoder
- Člen | 15
Mno, co mě tak ještě napadá. Nemůže to být tím, že xampp nemá extension=php_sqlite.dll
ale jen extension=php_pdo_sqlite.dll a extension=php_sqlite3.dll ? v php ini totiž extension=php_sqlite.dll vůbec není. a ani ve složce s ext
- Matúš Matula
- Člen | 257
Pridal som podporu pre SQLite3, mozes vyskusat ;) https://github.com/Ciki/MFU
Edit: Aaaa, stal sa zo mna Nette guru! :)) // 200-ty prispevok
Editoval Matúš Matula (21. 11. 2012 1:23)
- Honza Kuchař
- Člen | 1662
Nette guru: Gratuluji! :-) (také jsem byl tak překvapený :-))
Je to opravdu tak, říká to, že není k dispozici ta třída, která k dispozici je, je-li načteno rozšíření SQLLite (teď už nevím jestli 2 nebo 3, jde jednoduše vyčíst z kódu) Řešením tedy bude, projít si PHPINFO.
Myslíte, že by stálo za to vyhodit nějakou více informačně hodnotnou výjimku? (nicméně to samozřejmě opravím ve větvi pro Nette 0.9, přenést do dále je již na vás (zatím)) Však, pokud byste chtěli, myslím, že bych byl schopen portérům udělat branch v SVN, aby mohli pěkně mergovat… Pomohlo by vám to?
Já s XAMPP i Zend Server problém nemám. Na obojím to funguje bez komplikací. (testováno jen na Win)
A ještě drobná poznámka, proč se ti nezaregistruje ten DibiModel – pravděpodobně nemáš načtené Dibi. Nejjednodušší co můžeš udělat je, zrušit tu podmínku if(class_exists(..)) … a potom to buď sletí a nebo to celé smaž, protože když bys potom Dibi načetl změnil by se ovladač a stejně by to padlo, protože by v databázi nebyla tabulka pro MFU. Ten bootsrap s podmínkou je tam spíš kvůli demonstraci, že to umí fungovat s více ovladači a taky jako demonstrace, jak se to nastavuje.
- Honza Kuchař
- Člen | 1662
Opraveno, nějak to tu zapadlo.
Matúš Matula napsal(a): (https://forum.nette.org/…form-control?p=7)
Ad 2) @Honzo, ono aj v svn sa spolocne .js subory includuju este v @layout, akurat to nie je spomenute v dokumentacii
- Matúš Matula
- Člen | 257
Myslíte, že by stálo za to vyhodit nějakou více informačně hodnotnou výjimku?
Myslim, ze urcite :-)
Však, pokud byste chtěli, myslím, že bych byl schopen portérům udělat branch v SVN, aby mohli pěkně mergovat… Pomohlo by vám to?
To znamena, ze zmeny, kt. by si spravil v branch 0.9 (nazvime ju tak teraz), by si spravil aj do ostatnych branches a len by sme si fetchli zmeny?
P.S.:Ked uz budes pridavat test na existenciu sqlite
, nebolo by
mozno na skodu spravit check aj na sqlite3
. Tu by som nastavil (po
dokladnom otestovani) ako default driver (sqlite3 driver som pridal v repo)
s fallbackom na sqlite2
. Co ty na to?
- xhtmlkoder
- Člen | 15
Matúš Matula napsal(a):
Pridal som podporu pre SQLite3, mozes vyskusat ;) https://github.com/Ciki/MFU
Edit: Aaaa, stal sa zo mna Nette guru! :)) // 200-ty prispevok
Pergfektní, děkuji moc. Hned večer vyzkouším. ;-)
- orech
- Člen | 40
Zdravím, používam MFU – Pluploader pre Nette 2 a mal by som zopár otázok:
1. ako nastavím resize obrázku na strane klienta:
resize : {
width : 1920,
height : 1080,
quality : 100
}
EDIT: Vyriešil som, hodil som to rovno do kódu :) v initJS.js pre Pluploader.
2. MFU mám vložený ako formulárový prvok. Pre spracovanie uploadov mám
funkcie uploadFormSuccess
(zatiaľ tam je len dump pre kontrolu).
Uploady sa ale ajaxom odosielajú na nejakú fciu
uploadForm-submit
, ktorej výstupom je:
{„jsonrpc“ : „2.0“, „result“ : null, „id“ : „id“}
Tieto uploady by som rád spracoval.
Takto mám nastavený form a onSuccess fciu:
protected function createComponentUploadForm() {
$form = new Nette\Application\UI\Form;
$form->addMultipleFileUpload('file_upload', 'Uploader', 20)
->addRule('\MultipleFileUpload::validateFilled', 'Musíte odoslať aspoň jeden súbor!')
->addRule('\MultipleFileUpload::validateFileSize', 'Max. veľkosť všetkých odoslaných súborov je 20 MB!', 201024 * 1024); // 20 MB
$form->addSubmit('send', 'Odoslať')->setAttribute('class', 'btn btn-primary');
$form->onSuccess[] = callback($this, 'uploadFormSuccess');
return $form;
}
public function uploadFormSuccess(Nette\Application\UI\Form $form) {
try {
dump($form->values);
die;
foreach ($form->values->file_upload as $file) {
\ImageUploadModel::save($file, DATA_DIR);
}
$this->flashMessage('Obrázky uložené.');
} catch (\InvalidArgumentException $e) {
$this->flashMessage($e->getMessage());
}
}
3. Na GitHube je uvedené, že mám includovať JS knižnice do
stránky:
<script
src=„{$basePath}/js/nette-ajax-driver.js“></script> – mám
nejaký nette ajax plugin od Jana Mareka
<script
src=„{$basePath}/js/nette-ajax-form.js“></script> – od
rovnakého autora
Mám to pomenované inak, tak neviem, či sú to tie isté, alebo nie
Vopred veľmi ďakujem za pomoc.
Editoval orech (22. 11. 2012 11:43)
- Matúš Matula
- Člen | 257
Ad 1: spravne, tam to ma byt :)
Ad 2: ten vystup sa posiela z handleUploads() v MFUUIPlupload interface –
znamena, ze vsetko prebehlo ok – nahrali sa docasne subory a info o nich sa
ulozili do databazy. Teraz treba odoslat cely formular a tam uz by si mal
vidiet, ze sa ‚odoslali‘ subory (kt. sa v skutocnosti docasne ulozili cez
plupload), kt. mozes dalej spracovat
Ad 3: kym neriesis odosielanie formulara cez ajax, tak nie su treba..
- Matúš Matula
- Člen | 257
Skus vykreslit formular na skusku iba cez {control uploadForm}. Btw. pri tom ukoncovacom {/form} sa dava aj nazov komponenty? (ja ho nedavam, tak neviem :)