invalidateControl() – prosim o vysvetleni
- MW
- Člen | 626
Zdravím a prosím o malé objasnění.
Mám v šabloně dva snippety. Jeden pro formulář a druhy pro data vypsaná pod ním.
V onom formuláři mám kus javascriptu, protože se jedná o TinyMCE a bez umistění do snippetu se me vůbec při invalidaci nevykreslil. Problém nastal, když jsem odeslal formulářem data a invalidoval jak data tak i formulář, formulář se uz vykreslil, ale nedalo se do nej zapisovat.. nebyl jakoby inicializovany i přes to, ze jsem invalidoval potrebny javascript.
Našel jsem jediné řešení a to použít
$this->invalidateControl(); // tedy bez parametru
Nemuzu ale najit nejake vysvetleni, proc invalidate obou snipetu v sablobe nepohohla. Co dela invalidace bez parametru navíc?
Děkuji
Tady je kod:
<div id="tabs-2">
<div>
<button type="button" class="btn btn-primary btn-xs" data-toggle="collapse" data-target="#unexposed">
<span class="glyphicon glyphicon-plus"></span> Nový záznam
</button>
<div id="unexposed" class="collapse">
<div n:snippet="detailform">
<h2>Nová poznámka</h2>
{control contractsDetailForm}
<script type="text/javascript" src="{$basePath}/js/tiny_mce/tinymce.min.js"></script>
<script type="text/javascript">
tinymce.init({
selector: ".editarea",
language: "cs",
height: 150,
width: 1000,
entity_encoding: "raw",
plugins: [
"advlist autolink lists link image charmap print preview anchor",
"searchreplace visualblocks code fullscreen",
"insertdatetime media table contextmenu paste"
],
toolbar: "insertfile undo redo | styleselect | bold italic | link image | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent"
});
$('html, body').animate({ scrollTop: 0 }, 'slow');
</script>
{if $show}
<script type="text/javascript">
$('#unexposed').collapse('show');
</script>
{else}
<script type="text/javascript">
$('#unexposed').collapse('hide');
</script>
{/if}
</div>
</div>
</div>
<div n:snippet="details">
{foreach $details as $detail}
<div class="bs-callout bs-callout-info">
<p>
<span style="float:right;">Vložil: <b><i>{$detail->users->name}</i></b></span>
<h3><a href="#detail-{$detail->id}" name="detail-{$detail->id}" data-toggle="collapse" data-target="#detail-{$detail->id}">{$detail->title}</a></h3>
<div id="detail-{$detail->id}" class="collapse">
{!$detail->detail}<br /><br />
<span style="float:right; text-align: right;">
<a n:href="edit! detailid => $detail->id, show => 1" class="ajax btn btn-success btn-xs">upravit</a>
<a n:href="deleteDetail! detailid => $detail->id" class="btn btn-danger btn-xs"
data-confirm="modal"
data-confirm-title="Potvrzení akce"
data-confirm-text="Opravdu smazat novinu {$detail->title}?"
data-confirm-ok-class="btn-danger"
data-confirm-ok-text="Smazat"
data-confirm-cancel-class="btn-success"
data-confirm-cancel-text="Zrušit"
class="btn btn-danger btn-mini"
data-ajax="on">smazat</a>
</span><br />
</div>
</p>
</div>
{/foreach}
</div>
</div>
- amik
- Člen | 118
invalidateControl() invaliduje všechny snippety control, na které je
zavolán.
Jak vypadá tvoje PHP? voláš invalidateControl() z presenteru?
- zkontroluj, zda v odpovědi AJAXového požadavku ten snippet chodí. Každý rozumný prohlížeč má dnes nějakou konzoli, kde jsou vidět AJAX requesty a odpovědi stránky.
- když se HTML formuláře znovu natáhne AJAXem, je potřeba TinyMCE incializovat znovu. Pokud používáš nette.ajax.js, použij toto:
<script>
$.nette.ext('nejakyNazev', {
load: function() {
//tady zavolej inicializaci tinymce
}
}, {});
</script>
Tohle se zavolá jen jednou při načtení stránky, a tím se po každém ajax requestu provede inicializace tinymce. Hlavně nedotahuj javascripty AJAXem, to vůbec není pěkné řešení.