[addon multiplefileupload] MultipleFileUpload – form control

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

Mohu poskytnout pouze nástroj opačný, tj konverze z verze bez namespace na verzi s namespace…

Honza Kuchař
Člen | 1662
+
0
-

:) To je príma. Děkuji mnohokráte za informaci. Určitě mi to ušetří kupu času při přechod na PHP 5.3 a namespaces. Ale co s tou zpětnou kompatibilitou pro PHP 5.2 s a bez prefixů?

Jak to řeší jiní extrátoři? Asi se jdu zepatat – tedy založit vlákno

Honza Kuchař
Člen | 1662
+
0
-

PS: Norbe, proč takto užitečná věcička není v extras? ;)

LuKa
Člen | 3
+
0
-

@Honza Kuchar: jeste jednou. Kdyz uzivatel stiskne odkaz „Nejdou vám soubory nahrát? Klikněte zde.“ a pri nahravani dojde k chybe, jak to uzivatelovi rict. Uz se to tu nekde diskutovalo, ale bez nejakeho reseni. Asi nejlepsi by to bylo dostat jako error do formulare, ale nenapada me jak. Jde o to zobrazit vzniklou chybu pri nahravani, treba „Prekrocil jste maximalni povoleny pocet fotografii“. Diky.

Honza Kuchař
Člen | 1662
+
0
-

Tak to take funguje. ;) Ale pozor! Odeslanim pomoci standardnich html4 policek nefunguje ajax! A pokud ajax pouzivas a potrebujes vypsat tu hlasku, obal form do snippetu a ten invaliduj pri jakemkoli odeslani. Pokud ti to neni jasne, jeste muzu poslat priklad.

norbe
Backer | 405
+
0
-

Honza Kuchař napsal(a):

PS: Norbe, proč takto užitečná věcička není v extras? ;)

Napraveno :)

Honza Kuchař
Člen | 1662
+
0
-

Myslím, že se to určitě ujme. ;)

lvq
Člen | 47
+
0
-

Chtel bych se zeptat, co mam udelat pro to, aby po stisknuti tlacitka odeslat se zacaly nahravat soubory (bez toho, abych predtim musel stisknout tlacitko nahrat). Dobre to funguje v ukazce: http://multiplefileupload.projekty.mujserver.net/
Predem dik za radu

Honza Kuchař
Člen | 1662
+
0
-

Stačí mít načteny všechny ty JS soubory, podle dokumentace. (a nezapomenout v šabloně volat {!=MultipleFileUpload::getHead()})

lvq
Člen | 47
+
0
-

@Honza Kuchař: diky, mel's pravdu, bylo to tech javascriptech. Asi si zato muzu sam a nejak jsem zkombinoval soubory vice verzi dokupy. Ale kdyby mel nekdo stejnej problem, tak se zkuste podivat do souboru MultipleFileUpload.js na radek 6 a budto odmazat anebo pripsat mfu:

$(„div.mfuplupload[id]“, this);

jet
Člen | 4
+
0
-

Kolegové, po celém dnu hledání chyby se na vás obracím pro radu… snažím se rozchodit plupload a dostal jsem se do mrtvého bodu.

Vyberu soubory, stisknu spustit nahrávání, soubor se uploaduje a na konci, místo aby se objevila zelená fajfka, tak se objeví vykřičník a chyba IO error #2032 (nic relevantního jsem k této chybě nevygooglil).
Soubor se ve skutečnosti v pořádku nahrál, je v tempu a jde i normálně otevřít. Nicméně v db v poli data není žádná hodnota a pole chunk je vždy o jedna menší, než když ten samý soubor nahraju přes examplový mfu, který mi normálně funguje.

Exampl běži na nette bez prefixů, moje aplikace na prefixovaném nette 2.0dev, takže jsem celý MFU musel přepsat, aby fungoval s prefixy.

Může být problém v odlišnosti Template vs. NFileTemplate, nebo NHttpUploadedFile vs. HttpUploadedFile apod.?
Budu vděčný za jakoukoli radu!

P.S. xdebug mi bohužel nefunguje, z nějakého důvodu mi ho apache nechce načíst…

Editoval jet (29. 4. 2011 2:07)

Honza Kuchař
Člen | 1662
+
0
-

To se opravdu špatně radí.

  1. Zkus přepnout laděnku do produkčního režimu. (bude se logovat do souborů)
  2. určitě umí plupload nějaký onError, který ti předá co se stalo

Jinak problém s kompatibilitou by být neměl, ale nic nezaručuji, nezkoumal jsem to.

jet
Člen | 4
+
0
-

díky díky už to funguje, samozřejmě banalita, která je ve dvě v noci neodhalitelná, ještě když ji laděnka v developement modu nehlasí :)
logování do souboru prozradilo, že jsem zapomněl jednou přepsat HttpUploadedFile na NHttpUploadedFile… no nic, tak hlavně že už to jede..

Honza Kuchař
Člen | 1662
+
0
-

Tak to je fajn.

PS: Na projektech, které jsou takové více AJAXové používám laděnku výhradně v produkčním režimu… (doporučuji)

iguana007
Člen | 970
+
0
-

Já zase hojně využívám FireLogger – hodně mi to usnadňuje práci při vývoji CMS admina, kterého mám komplet AJAXového – odpadá tak nutnost zkoumat logy a padá mi to přímo do Firebugu.

iguana007
Člen | 970
+
0
-

Patrik Votoček napsal(a):

související vlákno: https://forum.nette.org/…vani-ladenky

Pěkné, toto vlákno jsem jaksi přehlíd, díky

Honza Kuchař
Člen | 1662
+
0
-

Já také. Ale je to trošku offtopic, to byla jen taková poznámka mimochodem, takže už toho prosím nechme nebo se přesuňme do výše odkazovaných míst. :-)

jet
Člen | 4
+
0
-

narazil jsem na dalsi problem, nefunguje mi upload na ostrem serveru, zatimco na localhostu vse bezi bez problemu:

  • kdyz v bootstrapu pouziju MultipleFileUpload::setQueuesModel(new MFUQueuesDibi()); tak se soubory do tempu nahraji, ale pri odeslani formulare to hodi chybu Field 'data' doesn't have a default value
INSERT INTO `files` (`queueID`, `created`, `name`, `chunk`, `chunks`)
VALUES ('255344dbdf23e3e611', 1304293955, '5d59a46a2cda17487b715b3f5f02015dc1471c77', 1, 4)

pritom vsechy tri metody mi na localhostu funguji bez problemu, uz nevim co s tim :(

Honza Kuchař
Člen | 1662
+
0
-
  1. Nevím proč.
  2. Není načteno rozšíření sqlite.
  3. Není načtená knihnovna Nette\Logger.
jet
Člen | 4
+
0
-

takze 2. jsem zavrhnul protoze na hostingu neni sqlite, ale porad mi vrta hlavou 1. – proc se neplni pole data?
neni mozne, ze je zakazana na hostingu v php konfiguraci nejaka klicova funkce, ktera tam dela tu serializaci ci co…? snazim se to zprovoznit na tomto hostingu :)

nn2
Člen | 9
+
0
-

Zdravím, dnes jsem narazil na nefunkčnost Plupload v Safari/Win. Vypátral jsem, že v Safari se neposílá chunks (není podpora?).

Pomohla úprava MFUUIPlupload.php, řádek 149:

if(($chunk+1) == $chunks || $chunks==0) {

Zkoušel jsem to pak i v jiných prohlížečích a funguje. Pokud jsem to udělal špatně, tak mě opravte.

Honza Kuchař
Člen | 1662
+
0
-

@nn2: mrknu na to
@jet: podivej se, co se ti uklada do databaze. (doporucuji zakazat clenup v Mfu, jinak asi nic neuvidis) Nejake specialni naroky to nema. (mrkni do zdrojaku dibi driveru)

iguana007
Člen | 970
+
0
-

Nemáte někdo prosím tento addon rozjetý pod latest dev verzí Nette pro 5.3 ? Mě se to ani za boha nedaří rozjet, pořád dostávám samé Exceptions a skončil jsem na této:

Argument 1 passed to Nette\Forms\Container::addComponent() must implement interface Nette\ComponentModel\IComponent, instance of MultipleFileUpload given, called in C:\xampp\htdocs\www\libs\Nette\Forms\Container.php on line 425 and defined

Laděnka se mi rozbalí na: MultipleFileUpload.php:498 a už vážně nevím co s tím.

Honza Kuchař
Člen | 1662
+
0
-

Já bohužel nemohu sloužit. Ovšem, myslím, že chybová hláška hovoří jasně, stačí se trošku vyspat. :-)

forkman
Člen | 72
+
0
-

Tak jsem se podle doporučení vyspal, snažil jsem se upravit MFU pro Nette 2.0-beta a Apač mi hází Segmentation fault :-)

Chyba, kterou popisuje iguana007 je způsobená tím, že ve 2.0-dev není třída FileUpload, ale je tam UploadControl. Když ale deklaraci třídi upravím na:

<?php
class MultipleFileUpload extends UploadControl { ...
?>

začne mi na tom padat Apač. Nevíte někdo co s tím? V OOP si nejsem zase tak jistý, ale udělal jsem to snad dobře, ne? :-D

Editoval forkman (20. 6. 2011 10:19)

B4nan
Člen | 13
+
0
-

ja to provozuju bez problemu na aktualnim nette. zmeny co si vybatuju:

  • Template ⇒ FileTemplate
  • FileUpload ⇒ UploadControl – tady se musi zmenit i definice dvou funkci, ktery vraceli FileUpload

plus jestli tam bylo jeste neco tak mi to krasne ladenka vypsala, takze to slo opravit behem par minut. jestli furt nevis, tak ti muzu uploadnout moji upravenou verzi.

forkman
Člen | 72
+
0
-

Dík za nakopnutí, v MFUTemplate.php jsem změnil Template na FileTemplate a už to funguje :-) Je ale s podivem, že to způsobovalo pád serveru … Zásadně to totiž upravuju tak, že odstraňuju chyby, co mi ukáže laděnka.

Honza Kuchař
Člen | 1662
+
0
-

Upřímně nevím, čím to je. Kdysi se mi to stávalo také, způsoboval to neaktuální xdebug.

Darkry
Člen | 101
+
0
-

Zdravím,

chtěl bych tohle rozšíření rozchodit pod verzí Nette Framework (version 2.0-dev 9f535f9 released on 2011-01-10)

Nakopíroval jsem potřebné soubory nahradil Template ⇒ FileTemplate, ale házelo mi to toto:
Unknown macro {!uploadLink|escapeJs} in ...\Plupload\initJS.js:14. Nechápu proč se latte plete do .js souborů, ale také nechápu proč jsou js soubory ve složce app (app/components/multipleFileUpload/...../initJS.js)

Každopádně když jsem do bootstrapu přidal:

MultipleFileUpload::getUIRegistrator()
    ->clear()
    ->register("MFUUIHTML4SingleUpload")
    ->register("MFUUIUploadify");

a změnil tak nahrávač na Uploadify (i když bych upřednostňoval Plupload) tak se sice žádná laděnka neobjevila, ale objevil se mi HTML4SingleUpload (flash i js i všechno v prohlžíeči mám – nejnovější chrome). Podíval jsem se do konzole a mám tam toto:
Uncaught ReferenceError: MFUFallbackController is not defined
Chyba se odehrává někde na tomto řádku:
Github

V čemž se mi jednak nechce hrabat a jednak moc dobře neumím javascript takže bych to akorát rozbil ještě víc.

Nejradši bych opravil tu první chybu abych měl Plupload, ale tak pokud by bylo snazší opravit ten Uploadify tak se taky nebráním :-).

Díky moc

Honza Kuchař
Člen | 1662
+
0
-

Předem, myslím, že oprava by neměla být až zase tak složitá.

K tomu makru: Budeš muset hledat, jaká existuje k tomu makru alternativa v Nette 2.0. Byla to fce, která escapovala string v JavaScriptu. (Zkus si vytvořit šablonu v které bude <script type=„text/javascript“>var test = {$test}</script>; a z vygenerovaného PHP kódu šablony (v /APP_DIR/data/tmp) se pokud vyčíst, kam jít hledat dále)

PlUpload by neměl být problém (potom, co najdeš alternativu k tomu makru)

MFUFallbackController: Co dělá je napsáno v dokumentaci/fóru. Ale to je teď jedno. Píše to, že třída není načtená, tedy zkus hledat proč. Definovaná je v souboru: Nette_MultipleFileUploader\document_root\js\MFUFallbackController.js a za normálních okolností se vypisuje do @layout pomocí příkazu: {!=MultipleFileUpload::getHead()}. (⇒ proto se MFU+latte plete do JS ;-) )

Darkry
Člen | 101
+
0
-

Díky moc. Nakonec byla chyba v tom, že v init.js je:
{!uploadLink|escapeJs}
místo:
{!$uploadLink|escapeJs}

pak už všechno šlo více méně bez problémů. Díky.

zuhla
Člen | 33
+
0
-

Dobrý den, mám Nette 2.0 Beta. Nějaké chyby jako třeba FileUpload ⇒ UploadControl jsem už spravil, ale nyní mi hází laděnka chybu v \UserInterface\Interfaces\MFUUIBase.php . Mám MultiFIleUpload už rozjetý na jiných projektech se starší verzí Nette, ale nyní jsem udělal projekt na nové a zde se zasekl :(

..\multi2\app\controls\MultipleFileUpload\UserInterface\Interfaces\MFUUIBase.php:56 source ►  Environment:: getVariable (arguments ►)

49:            //$presenter = Environment::getApplication()->getPresenter();
50:            $template->onPrepareFilters[] = array($this, 'templatePrepareFilters');
51:
52:            // default parameters
53:            //$template->component = $this; // DEPRECATED!
54:            //$template->control = $this;
55:            //$template->presenter = $presenter;
56:            $template->baseUri = Environment::getVariable('baseUri');
57:            $template->basePath = rtrim($template->baseUri, '/');
58:
59:            // flash message
60:            /*if ($presenter !== NULL && $presenter->hasFlashSession()) {
61:                $id = $this->getParamId('flash');
62:                $template->flashes = $presenter->getFlashSession()->$id;
63:            }

Děkuji za odpovědi a rady.

B4nan
Člen | 13
+
0
-

zuhla napsal(a):

$template->baseUri = Environment::getVariable('baseUri');

vyměň za

$template->baseUri = Environment::getHttpRequest()->getUrl()->baseUrl;

zuhla
Člen | 33
+
0
-

Díky, už jsem postoupil dál. Jenže mám teď jiný problém. Příkaz v layout.latte {!=MultipleFileUpload::getHead()} nenačte vůbec nic. Jako by tam nebyl. Je v nejnovějším nette nějaká změna, která tady toto nepodporuje?

Děkuji

iguana007
Člen | 970
+
0
-

To jsem taky řešil … najdi si, kde se načítá ta template a přepiš třídu Template na FileTemplate

Honza Kuchař
Člen | 1662
+
0
-

Je někdo z vás, kdo MFU portoval pro Nette 2.0 a je ochoten sepsat stručný seznam toho, co je třeba změnit, aby MFU fungovalo pod Nette 2.0? Budu moc rád a prozatím tento seznam připojím do dokumentace, ať s tím tady lidé netráví kupu času.

Případně, budu moc rád za ZIP balíček, funkčního MFU pro Nette 2.0. Opět přidám odkaz do dokumentace.

@Darkry: Vydán bugfix. Divím se, že mi to fungovalo i s takovýmto překlepem?! Asi moc spoléhám na Laděnku.

zuhla
Člen | 33
+
0
-

Zkusím si najít tento týden čas a udělám to ;)

zuhla
Člen | 33
+
0
-

Chtěl jsem se ještě zeptat, jak by jste vy řešili, pokud budu mfu používat jako upload jen na obrázky, aby to uložilo obrázek v plné velikosti, ale uložilo to taky thumb v menší kvalitě a v zadaném rozlišení. Mě teĎ vůbec nic nenapadá :(

Děkuji

kucix
Člen | 33
+
0
-

dostaneš z toho data stejně, jako kdybys dal input type=file …
takže si to načti jako obrázek a dej resize ;)

zuhla
Člen | 33
+
0
-
iguana007
Člen | 970
+
0
-

Nenarazili jste pls někdo na problém, že když je uploader v Groupě formu, tak nefunguje? U mě tomu tak je a nevím co s tím. Projevuje se to tak, že Add files button nefunguje + text pod uploaderem je vyrenderovaný 2×.

Když Groupy z formu odstraním, tak je vše ok.

Používám interface Plupload.

Editoval iguana007 (21. 7. 2011 12:56)

zuhla
Člen | 33
+
0
-

Tohle mě taky dělalo. Podle mě je to nějaká chyba v Plupload, protože když jsem ho dal pryč a nahradil swfuploadem tak vše fungovalo. Ale neumím si vysvětlit, proč je chyba zrovna v něm

jenda87
Člen | 20
+
0
-

Máte prosím někdo funkční MFU pro php 5.3 a Nette 2.0 Beta?
Prodral jsem se sice všemi chybami, ale MFU stejně nefunguje, resp. interface uploadify. Už nevím co s tím.

Situace je taková, že se nezobrazí tlačítko Uploadify, jen odkaz na htmlsingle upload. Žádné chyby js, ani ničeho jiného ve firebugu.

MFU registruji takto:

MultipleFileUpload::register();

MultipleFileUpload::getUIRegistrator()
        ->clear()
        ->register("MFUUIHTML4SingleUpload")
        ->register("MFUUIUploadify");
MultipleFileUpload::setQueuesModel(new MFUQueuesDibi());

Editoval jenda87 (24. 7. 2011 13:09)

Casper
Člen | 253
+
0
-

Zdravím, taky se snažím prokousat změnami pro Nette 2.0-beta (PHP 5.3), ale zasekl jsem se na chybě v MFUUIUploadify.php na řádku 55, kde mi Laděnka hlásí: Callback ‚Nette\Templates\TemplateHelpers::loader‘ is not callable.

52:        public function render(MultipleFileUpload $upload) {
53:            $template = $this->createTemplate(dirname(__FILE__)."/html.phtml");
54:            $template->uploadifyId = $upload->getHtmlId() . "-uploadifyBox";
55:            return $template->__toString(TRUE);
56:        }

Víte někdo jak na to?

Editoval Casper (26. 7. 2011 19:30)

kashpi
Člen | 48
+
0
-

Jj tohle sem řešil, v MFUUIBase.php ve funkci createTemplate() uprav řádek na

<?php
  $template->registerHelperLoader('Nette\Templating\DefaultHelpers::loader');
?>

ale stejně jsem to ještě nerozchodil celý :(

Editoval kashpi (29. 7. 2011 17:43)

Casper
Člen | 253
+
0
-

Díky moc, pomohlo, prokousal jsem se o kus dál, ovšem zasekl jsem se na další (podivnější) chybové hlášce v souboru MFUUIUploadify.php ve funkci renderInitJavaScript:

Missing item 'baseUri' na řádku 74 (to i tehdy pokud odkomentuji řádek 72; dokonce v debugu ve výpisu template je v params vidět naplněný baseUri vždy)

72:            //$tpl->baseUri = WEB_DIR."/";
73:            Nette\Diagnostics\Debugger::barDump($tpl);
74:            return $tpl->__toString(TRUE);

Neřešil jste někdo podobný problém?

Honza Kuchař
Člen | 1662
+
0
-

Vzhledem k tomu, ze se mi chyba neprojevuje, nejspis budes muset udelat nejaiy balicek s mini aplikaci, kde se to projevi. Tzn. jeden formular s jednim polickem.

//edit: samozrejme s i s pribalenym nette. Proste kompletni balicek.

Martin7
Člen | 23
+
0
-

Ahoj, zkouším rozchodit MFU na nette 2.0 v php 5.2. Opravil jsem chyby, které to hlásilo pomocí tohoto topicu. Teď už to žádné chyby nehází, ale nezobrazí se Plupload zobrazí se pouze věta Nejdou vám soubory nahrát? Klikněte zde., pokud na tuto větu kliknu tak se nic nestane.

zde hlavicka jestli mi nechybí nejaký soubor potrebný pro fungování.
Header:

	<link rel="stylesheet" media="screen,projection,tv" href="{$basePath}/css/screen.css" type="text/css">
	<link rel="stylesheet" media="print" href="{$basePath}/css/print.css" type="text/css">
        <link rel="stylesheet" media="print" href="{$basePath}/css/example.css" type="text/css">
        <link rel="stylesheet" media="print" href="{$basePath}/css/MultipleFileUpload/plupload.queue.css" type="text/css">
	<link rel="shortcut icon" href="{$basePath}/favicon.ico" type="image/x-icon">
      {!=MultipleFileUpload::getHead()}
  <link rel="stylesheet" href="http://jquery-ui.googlecode.com/svn/tags/1.7.2/themes/blitzer/ui.all.css" type="text/css" />
  <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
  <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/tags/1.7.2/ui/minified/ui.core.min.js"></script>
  <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/tags/1.7.2/ui/minified/ui.slider.min.js"></script>
  <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/tags/1.7.2/ui/minified/ui.datepicker.min.js"></script>
  <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/tags/1.7.2/ui/minified/i18n/ui.datepicker-cs.min.js"></script>
  <script type="text/javascript" src="{$basePath}/js/timepicker-cs.js"></script>
<script type="text/JavaScript" src="{$basePath}/js/jquery.livequery.js"></script>
<script type="text/JavaScript" src="{$basePath}/js/nette-ajax-driver.js"></script>
<script type="text/JavaScript" src="{$basePath}/js/nette-ajax-form.js"></script>
<script type="text/JavaScript" src="{$basePath}/js/MFUFallbackController.js"></script>
<script type="text/javascript" src="{$basePath}/js/MultipleFileUpload/plupload/gears_init.js"></script>
<script type="text/javascript" src="http://bp.yahooapis.com/2.4.21/browserplus-min.js"></script>
<script type="text/javascript" src="{$basePath}/js/MultipleFileUpload/plupload/plupload.full.min.js"></script>
<script type="text/javascript" src="{$basePath}/js/MultipleFileUpload/plupload/jquery.plupload.queue.min.js"></script>
<script type="text/javascript" src="{$basePath}/js/MultipleFileUpload/plupload/cs.js"></script>
<script type="text/javascript" src="{$basePath}/js/MultipleFileUpload/plupload/MultipleFileUpload.js"></script>

komponenta:

 protected function createComponentFormPridatFoto($name) {
 $form = new AppForm($this,$name);

$form->addMultipleFileUpload("pokus1","Testík",20)
    ->addRule("MultipleFileUpload::validateFilled","Musíte odeslat alespoň jeden soubor!")
    ->addRule("MultipleFileUpload::validateFileSize","Soubory jsou dohromady moc veliké!",1024); // 1 KB
return $form;

 }

Editoval Martin7 (4. 8. 2011 15:08)

Honza Kuchař
Člen | 1662
+
0
-

Pokud tam musíš vypisovat všechny ty soubory k načtení, tak je chyba někde v {!=MultipleFileUpload::getHead()}. Protože ten má za úkol vygenerovat kód, který všechny potřebné soubory načte.

//EDIT: Tuším tu někdo psal něco o záměně Template za FileTemplate. MFU má na šablony velmi jednoduchou vlastní třídu, která dědí v Nette 0.9.x od Template. V Nette 2.0 má dědit od FileTemplate.

Editoval Honza Kuchař (5. 8. 2011 0:59)