problém se snippety a prázdným JSON
- RDPanek
- Člen | 189
Ahoj mám menší problém se snippety.
ajax mi vrací: {„state“:[]} nevím proč.
zajímavý efekt, kdy mám jednu ajaxovou část, která bez problému funguje,
jiná část aplikace na jiné stránce již ne. Napadlo mě, že by byl
problém v {snippet:form}. toto uvození bloku html, který chci měnit
používám na obou stránkách, tak mě napadlo, zda-li nedochází k nějaké
kolizy, když jedna stránka použije {snippet:form} a druhá též – ale ne
ve stejný okamžik…
proč dostávám prázdný JSON? je někde podrobný popis, jak snippety
fungují, kam se co ukládá, co by se mělo vracet a proč? Díky
- wdolek
- Člen | 331
zkusil bych precist tento thread: https://forum.nette.org/…agie-v-praxi
magie se tomu rika opravnene – ale staci si trosku zadumat a clovek na to
prijde. setkal sem se jednou s tim, ze programator(ka) zapomela dat zavinac
pred {widget ...}
v kterem snippet mela.
- muze to byt ale banalnejsi – pokud je snippet v tele if-else, musi byt zavinac i pred if-else…
- pokud je snippet v nejake sablone pohledu (neco.phtml) mel by byt zavinac
i pred
{block #content}
jinak snippet by mel vratit v payloadu pole snippetu, id snippetu a html,
ktere pak javascript nacpe misto puvodniho html
kodu… {"state":{"language":"cs"},"snippets":{"snippet-mediaList-itemList":"<p>novy obsah snippetku</p>"}}
- RDPanek
- Člen | 189
Takže mám view: default.phtml
{block #content}
<div id="tabs" >
<ul>
<li><a href="#tabs-1" title="Video">
<img src="{$basePath}/images/application_view_tile.png" style="border:0;" />
Video</a></li>
</ul>
<div id="tabs-1" style="background-color: #ffffff; display: block;">
{include movies.phtml}
</div>
</div>
movies.phtml
{block #content}
{if isset($newVideo)}
<fieldset>
<legend>Přidat Video</legend>
{snippet:form}
{if isset($values)}
<strong>Stav nahrávání:</strong><br />
<b>{=count($values["upload"])}</b> přijatých souborů.
<br />
<br />
<div id="indicator" style="padding: 5px; background-color: #FFFFFF; ">
<img src="{$basePath}/images/admin/accept.png" style="border:0;" />
ukládání je úspěšně u konce.
</div>
{else}
{widget form}
<br />
<div id="indicator" style="padding: 5px; background-color: #FFFFFF; display: none;">
<img src="{$basePath}/images/admin/reload_green.gif" style="border:0;" />
pracuji, čekejte prosím...
</div>
{/if}
{/snippet}
</fieldset>
<br />
<fieldset>
<legend>Akce</legend>
{widget endForm}
</fieldset>
<!-- vypne prehled kategorii -->
{assign $closeViewPhotogallery '1'}
{/if}
MoviesPresenter.php
public function createComponentForm($name)
{
$form = new AppForm($this,$name);
$form->getElementPrototype()->class[] = "ajax";
$form->addTextArea('description_file', 'Popis:', 30, 2);
/*
* Nastavim formular, podle toho, zda-li se jedna o fotografii
* nebo video
*/
$enviroment = Environment::getHttpRequest()->getQuery();
$form->addMultipleFileUpload("upload","Vybrat: ")
/*->addRule("MultipleFileUpload::validateFilled","Musíte odeslat alespoň jeden soubor!")
->addRule("MultipleFileUpload::validateFileSize","Soubory jsou dohromady moc veliké!",100*1024)*/;
$form->addSubmit("odeslat", "Uložit vybranné");
$form['odeslat']->getControlPrototype()->class('odeslatBut');
$form->onSubmit[] = array($this,"onSubmit");
// Invalidace snippetů
$form->onInvalidSubmit[] = array($this,"handlePrekresliForm");
$form->onSubmit[] = array($this,"handlePrekresliForm");
}
public function onSubmit(Form $form) {
$data = $form->getValues();
$enviroment = Environment::getHttpRequest()->getPost();
// Předáme data do šablony
$this->template->values = $data;
$queueId = uniqid();
// Přesumene uploadované soubory
foreach($data["upload"] AS $file) {
$directory = "videogallery";
// $file je instance HttpUploadedFile
$filePath = strtolower(Helpers::convertDiacritic(
str_replace(" ", "", "/".$directory."/q{".$queueId."}__f{".rand(10,99)."}__".$file->getName()))
);
$copyFilePath = WWW_DIR.$filePath;
/*
* @todo Pri nahravani souboru nejak osetrit neuspech
*/
if($file->move($copyFilePath)){
/*
* Pokus o nastaveni limitu na serveru
*/
Helpers::setServerLimits();
/*
* Ulozeni zaznamu
*/
$arr = array(
'id_admin' => $this->myInfo['id_admin'],
'status' => '0',
'date_create' => Date("Y-m-d", Time()),
'name_video' => $data['description_file']?$data['description_file']:Helpers::convertDiacritic(str_replace(" ", "", strtolower($file->getName()))),
'size_disk_video' => filesize($copyFilePath),
'name_video_disk' => $filePath
);
$this->multimediaModel->SaveNewInfoFile($arr, "video");
}
}
}
public function handlePrekresliForm() {
$this->invalidateControl("form");
}
:-)
je to z rozsireni MultiFileUpload
- wdolek
- Člen | 331
zkusil bych nasledujici zazavinacovani (zakrucankovani :D)…
- default.phtml
@{block #content}
...
@{include movies.phtml}
...
@{/block}
- movies.phtml
@{block #content}
@{if isset ($newVieo)}
...
{snippet ...}
...
@{/if}
@{/block}
- @layout.phtml
<html>
<head>...</head>
<body>
@{include #content}
</body>
</html>
(a take bych zkusil lepe odsazovat kod ;))
Editoval wdolek (3. 8. 2010 16:20)
- RDPanek
- Člen | 189
@layout.phtml mi vyskočil error – nic méně, MultipleFileUpload mám na jednom místě ve stejné aplikaci implementováno, ale v jiné části mi to nefunguje, i když napsaný by to mělo být dobře – jde mi o to, že výsledek z nefunknčí implementace ve firebugu je: {„state“:[]}, nejsem si jistej, jest-li tím, že rozšíření MultipleFileUpload resp. jeho implementace používám v jedné části systému a pak v druhé, tak jest-li se něco v jeho implementaci nesmí jmenovat stejně, jest-li se nějaká jeho část nekešuje, tzn. když používám dvě stejné implementace z různých míst, tak jest-li nedochází ke kolidaci…
- RDPanek
- Člen | 189
Repeat:
deafult.phtml
@{block #content}
<div id="tabs" >
<ul>
<li><a href="#tabs-1" title="Video">
<img src="{$basePath}/images/application_view_tile.png" style="border:0;" />
Video</a></li>
</ul>
<div id="tabs-1" style="background-color: #ffffff; display: block;">
@{include movies.phtml}
</div>
</div>
movies.phtml
@{block #content}
<script type="text/javascript" language="javascript" src="{$basePath}/js/lytebox/lytebox.js"></script>
<script type="text/JavaScript" src="{$baseUri}js/jquery.livequery.js"></script>
<script type="text/JavaScript" src="{$baseUri}js/swfobject.js"></script>
<script type="text/JavaScript" src="{$baseUri}js/jquery.uploadify.v2.1.0.js"></script>
<script type="text/JavaScript" src="{$baseUri}js/nette-ajax-driver.js"></script>
<script type="text/JavaScript" src="{$baseUri}js/nette-ajax-form.js"></script>
<script type="text/JavaScript" src="{$baseUri}js/MultipleFileUpload.js"></script>
<link rel="stylesheet" href="{$basePath}/js/lytebox/lytebox.css" type="text/css" media="screen" />
<link rel="stylesheet" media="screen,projection,tv" href="{$baseUri}css/uploadify.css" type="text/css" />
<script>
$(function() {
$(".videoBox").mouseover(function() {
$(this).find("#editIcon").show();
});
$(".videoBox").mouseout(function() {
$(this).find("#editIcon").hide();
});
});
</script>
<!-- nove video -->
@{if isset($newVideo)}
<fieldset>
<legend>Přidat Video</legend>
{snippet:form}
{if isset($values)}
<strong>Stav nahrávání:</strong><br />
<b>{=count($values["upload"])}</b> přijatých souborů.
<br />
<br />
<div id="indicator" style="padding: 5px; background-color: #FFFFFF; ">
<img src="{$basePath}/images/admin/accept.png" style="border:0;" />
ukládání je úspěšně u konce.
</div>
{else}
{widget form}
<br />
<div id="indicator" style="padding: 5px; background-color: #FFFFFF; display: none;">
<img src="{$basePath}/images/admin/reload_green.gif" style="border:0;" />
pracuji, čekejte prosím...
</div>
{/if}
{/snippet}
</fieldset>
<br />
<fieldset>
<legend>Akce</legend>
{widget endForm}
</fieldset>
<!-- vypne prehled kategorii -->
{assign $closeViewPhotogallery '1'}
@{/if}
- wdolek
- Člen | 331
ze v payloadu je prazdny pole snippetu bych spise vysvetloval tim, ze Nette takovy snippet vubec nezaregistrovalo (ID a nove HTML se do payloadu neposle pokud Nette nema takovy snippet „zaregistrovany“). je zavinac (-ova magie) spravne ve vsech „nadrazenych“ sablonach?
… a jeste me napada – smazat cache sablon?