Nepřekreslí se mi snippet

ForestCZE
Člen | 209
+
0
-

Ahoj, mám problém s překreslením snippetu a nevím kde.

Šablona:

{snippet expandations}
	<fieldset>
		<legend>HTML5 <a class="expandation" n:href="expandation! pref => 'html5'"><i class="fa {if !$httpServices->getCookie('html5')}fa-angle-up{else}fa-angle-down{/if}"></i></a></legend>
		{if !$httpServices->getCookie('html5')}
			{include listing posts => $postsListing->getAllPostsDescription([1, 2])}
		{/if}
	</fieldset>
{/snippet}

Handle metoda:

public function handleExpandation($pref)
{
	if($this->httpServices->getCookie($pref) == null)
		$this->httpServices->setCookie($pref, true);
	else
		$this->httpServices->deleteCookie($pref);
	$this->redrawControl('expandations');
}

jQuery:

function Expandations()
{
	$("body").on("click", "a.expandation", function(e){
		e.preventDefault();
		var url = $(this).attr("href");

		$.ajax({
			type: 'GET',
			url: url,
			success: function(data)
			{
				$("#snippet--expandations").html(data.snippets['snippet--expandations']);
			}
		});
	});
}

Když kliknu, tak se provede v handle metodě to, co má, ale nepřekreslí se snippet. Když obnovím stránku, tak se to aktualizuje. Co mám špatně? Díky.

Ondřej Kubíček
Člen | 494
+
0
-

nejlepší by bylo, kdybys použil na to již hotovou knihovnu

nicméně v tom success ty data obsahují ten nový snippet? je to tam správně?

ForestCZE
Člen | 209
+
0
-

Ondřej Kubíček napsal(a):

nejlepší by bylo, kdybys použil na to již hotovou knihovnu

nicméně v tom success ty data obsahují ten nový snippet? je to tam správně?

No to právě nevím, nevím, jak si to vypsat. Mi to vyhazuje: [object Object]

EDIT: Hodil jsem si tam:

console.log(data.snippets['snippet--expandations']);

A je tam ten původní, nepřekreslený.

Editoval ForestCZE (24. 8. 2018 14:10)

Ondřej Kubíček
Člen | 494
+
+1
-

máš tam metodu render* ? nepřepisuješ si to? protože handle se volá dřív než render

ForestCZE
Člen | 209
+
0
-

Ondřej Kubíček napsal(a):

máš tam metodu render* ? nepřepisuješ si to? protože handle se volá dřív než render

V renderu si volám jenom třídy do šablony.

public function renderDefault()
{
	$this->template->postsListing = $this->postsListing;
	$this->template->httpServices = $this->httpServices;
}
Phalanx
Člen | 310
+
0
-

@ForestCZE nevidím, jestli si něco nepřepisuješ, ale rozhodně bych ti doporučil použít přímo Nette ajax knihovnu, která by se ti měla postarat sama o překreslení snippetu (který ty teď přepisuješ ručně).

<script>
// $.ajax
$.nette.ajax

// a nezapomen inicializovat
$(function () {
    $.nette.init();
});
</script>
ForestCZE
Člen | 209
+
0
-

Phalanx napsal(a):

@ForestCZE nevidím, jestli si něco nepřepisuješ, ale rozhodně bych ti doporučil použít přímo Nette ajax knihovnu, která by se ti měla postarat sama o překreslení snippetu (který ty teď přepisuješ ručně).

<script>
// $.ajax
$.nette.ajax

// a nezapomen inicializovat
$(function () {
    $.nette.init();
});
</script>

Tak jsem to upravil:

$(function()
{
	$.nette.init();
});

A k odkazu jsem do třídy přidal ajax a chová se to úplně stejně, jako když jsem si to přepisoval ručně.

Ondřej Kubíček
Člen | 494
+
0
-

Nevím jestli ten include nemá být obalený snippetArea, ale to myslím jen v případě, že bys měl snippety uvnitř toho includu. A když na test vyhodis include a dáš tam obyč text, stále nic?

MajklNajt
Člen | 471
+
0
-

máš nalinkovaný netteForms.js? ak nie, musíš to upraviť takto:

<script>
$(function () {
    Nette = {
        initForm: function () {}
    };
	$.nette.init();
});
</script>
ForestCZE
Člen | 209
+
0
-

Ondřej Kubíček napsal(a):

Nevím jestli ten include nemá být obalený snippetArea, ale to myslím jen v případě, že bys měl snippety uvnitř toho includu. A když na test vyhodis include a dáš tam obyč text, stále nic?

Stále nic. Zkusil jsem jednoduchý příklad zde a to funguje úplně normálně. Takže já si to musím asi vážně někde nechtíc přepisovat, ale nemám tušení kde.

Zuben45
Člen | 268
+
0
-

A co třeba takhle ?

{snippet expandations}
    <fieldset>
        <legend>HTML5 <a class="expandation" n:href="expandation! pref => 'html5'"><i class="fa {if !$html5Cookie}fa-angle-up{else}fa-angle-down{/if}"></i></a></legend>
        {if !$html5Cookie}
            {include listing posts => $postsListing->getAllPostsDescription([1, 2])}
        {/if}
    </fieldset>
{/snippet}
// Render
public function renderDefault()
{
	if (!isset($this->template->html5Cookie)) {
		$this->template->html5Cookie = $this->httpServices->getCookie($pref) == null
			? false
			: $this->httpServices->getCookie($pref);
	}
}

// Handle
public function handleExpandation($pref)
{
    if($this->httpServices->getCookie($pref) == null) {
        $this->httpServices->setCookie($pref, true);
		$this->template->html5Cookie = true;
	} else {
        $this->httpServices->deleteCookie($pref);
		$this->template->html5Cookie = false;
	}
    $this->redrawControl('expandations');
}

Editoval Zuben45 (27. 8. 2018 20:35)

Felix
Nette Core | 1186
+
+1
-

Pro edukativni ucely jsem udelal tenhle priklad (contributte/webpack-skeleton). Snippety tam funguji a je tam i Webpack napriklad. Muzes mrknout.

Zuben45
Člen | 268
+
0
-

@Felix díky, příklad pro Webpack se bude hodit :)

Off0
Člen | 3
+
0
-

Mam také problém s překreslením snippetu. Můžete mi někdo poradit, kde by mohla být chyba ? Zkoušel jsem vytvořit i přes komponentu, také mi nefungovalo a ani přes SnippetArrea s includovaným .latte.

jQuery :

<script>

function start() {

   $.nette.init();
   message_js();

 function message_js() {

        //message
        $.nette.ajax({
            url: "/administration/?do=removeFlashMessage",
            data: {nic: "nic"},
            success: function () {
                $.nette.ext('snippet_test', {
                    success: function (payload) {
                        var snippets = this.ext('snippets', true);
                        $("#snippet--flashes").html(snippets);
                    }

                })
            }});
    }

}
</script>

Presenter :

<?php

  public function renderDefault() {
		 $this->template->flashes = array();
		$this->flashMessageCustom("START");
	}

  public function flashMessageCustom($text) {
        array_push($this->template->flashes, $text);
    }

 function handleRemoveFlashMessage() {

        if ($this->isAjax()) {
            $this->flashMessageCustom("TEST");
            $this->presenter->redrawControl('flashes');
        }
    }
?>

Šablona :

<?php

<body>

    {snippet flashes}
        {foreach $flashes as $flash}
            <div class='message'> <img src='./users/images/0.jpg'> <p id='message__text'>{$flash}</p></div>
        {/foreach}
    {/snippet}

</body>

?>
David Matějka
Moderator | 6445
+
+1
-

ahoj,
priste zaloz radeji nove vlakno, nez otevirat stare

  • co znamena, ze to nefunguje? provede se ten pozadavek a jen se neprekresli snippet nebo se vubec ajax pozadavek neprovede?
  • dival ses do developer tools v prohlizeci, jesti tam neni chyba?
  • inkludujes nette.ajax a volas tu funkci start?
  • tim kodem $this->template->flashes = array(); prepises to, co si zapsal v handleRemoveFlashMessage, jelikoz render metoda se vola po zpracovani signalu (viz dokumentace https://doc.nette.org/…n/presenters#…)
Ondřej Kubíček
Člen | 494
+
+1
-

@Off0 handle metoda se zavolá dřív než renderDefault tudíž v handle přidáš do flashes druhou položku, pak dojde na render, vymažeš celé pole a znovu tam setneš start
za druhé, proč máš v success $.nette.ext ? ty snippety se překreslí sami, nemusíš si je překřeslovat sám

Off0
Člen | 3
+
0
-

Ahoj, dobře

  • vyřešeno, bylo to tím životním cyklem, že se mi přepsala proměnná, již mi vše funguje.

Děkuju za ochotu @DavidMatějka

Off0
Člen | 3
+
0
-

@OndřejKubíček Děkuji za rady, odstranil jsem nadbytečné – $.nette.ext.