Vyvolání toast message z presenteru

rerege
Člen | 58
+
0
-

Chtěl bych použít Toast message v momentě úspěšného vložení produktu do košíku.

Mám připravenou funkci v JavaScriptu – jak jí správně „zavolat“ z presenteru?

Kárl

Pavel Janda
Člen | 977
+
+3
-

@rerege Udělej si na to komponentu. :) Komponenta se umí sama překreslit. Buď tak a nebo ti jenom komponenta pošle custom message, kterou odchytíš v JS a ukážeš message.

Tuto komponentu si kdekoliv v aplikaci vytáhneš a zavoláš. Což?

uestla
Backer | 796
+
+1
-

Nastavit v presenteru boolean proměnnou a podle její hodnoty v šabloně (ne)zavolat připravenou funkci v JavaScriptu?

rerege
Člen | 58
+
0
-

Chlapci moc díky… pouze pocitově se mi řešení přes komponentu zdá lepší – bude to má první komponenta…
apropo – postupuji správně?

v app/components jsem vytvořil ToastControl.php

<?php
namespace App\Components;

use Nette\Application\UI\Control;
use Nette\Utils\ArrayHash;


class ToastControl extends Control {

    const TEMPLATE_PATH = '/../templates/components/Toast/';

    public function render($message) {
        $this->template->setFile(dirname(__FILE__) . self::TEMPLATE_PATH . 'toast.latte');
        $this->template->toast = $message;
        $this->template->render(); // Vykreslí komponentu.
    }
}

interface IPriceControlFactory {

    public function create();
}
?>

v app/templates/components/Toast/
jsem vytvořil toast.latte

a v ProductPresenteru jsem přidal
use App\Components\ToastControl;

nu, zatím se trápím

  1. jak v tom ProductPresenteru zavolat tu mojí komponentu

není někde nějaký jednoduchý příklad?

  1. a v toast.latte bude stačit pak jenom ???

    <script type=„text/javascript“>
    myFunction();
    </script>

přičemž v hlavním default.latte na konci připojím ten javascript
<script type=„text/javascript“ src=„{$basePath}/js/toast.message.js“ async=""></script>

GEpic
Člen | 562
+
+5
-

Nešli by k tomu využít již existující flash messages? :) Ty si můžeš vykreslit jakkoliv, třeba i v toastu. :)

Používám to takto:

{snippet flashMessages}
    <script n:inner-foreach="$flashes as $flash">
        flashMessage({$flash->message}, {$flash->type});
    </script>
{/snippet}

a pak v externím JS:

function flashMessage(message, type){
    $.notify({
        message: message
    },{
        type: type,
        delay: 2500,
        animate: {
            enter: 'animated fadeInRight',
            exit: 'animated fadeOutRight'
        },
        offset: {
            x: 20,
            y: 85
        }
    });
}

A používám k tomu tuto knihovničku.

A pokud nechceš používat jQuery, taktéž by s tím určitě nebyl problém, k tomu využíváme naopak
toastr.js

Editoval GEpic (5. 7. 2017 16:01)

rerege
Člen | 58
+
0
-

@GEpic velmi děkuji … vyzkouším… vypadá to easy.

Jinak to „Tuto komponentu si kdekoliv v aplikaci vytáhneš a zavoláš“ … to považuji za totální základ, který jsem z doku nepochopil, můžete mě pls trochu navést…

rerege
Člen | 58
+
0
-

@CZechBoY velmi děkuji … jsem pako – hledal jsem jenom v sekci o komponentách

Kárl

GEpic
Člen | 562
+
+1
-

@rerege pokud použiješ tu knihovnu bootstrap notify (a využíváš bootstrap jako takový), tak ti stačí ten kód který jsem ti zde poslal já, kdyby se ti nedařilo (nebo třeba bootstrap nepoužíváš), můžeš mi poslat soukromou zprávu, rád pomůžu.

Editoval GEpic (5. 7. 2017 20:56)

CZechBoY
Člen | 3608
+
+1
-

Je tu i pár dalších rozšíření/komponent, které řeší flash zprávy:
http://blog.honzacerny.com/…te-framework

rerege
Člen | 58
+
0
-

Chlapci moc děkuji…
toto fórum opravdu plní svůj účel!

Kárl

jAkErCZ
Člen | 321
+
0
-

GEpic napsal(a):

Nešli by k tomu využít již existující flash messages? :) Ty si můžeš vykreslit jakkoliv, třeba i v toastu. :)

Používám to takto:

{snippet flashMessages}
    <script n:inner-foreach="$flashes as $flash">
        flashMessage({$flash->message}, {$flash->type});
    </script>
{/snippet}

a pak v externím JS:

function flashMessage(message, type){
    $.notify({
        message: message
    },{
        type: type,
        delay: 2500,
        animate: {
            enter: 'animated fadeInRight',
            exit: 'animated fadeOutRight'
        },
        offset: {
            x: 20,
            y: 85
        }
    });
}

A používám k tomu tuto knihovničku.

A pokud nechceš používat jQuery, taktéž by s tím určitě nebyl problém, k tomu využíváme naopak
toastr.js

Mohl bych se zeptat co dělám špatně?

Do šablony jsem si vložil

{snippet flashMessages}
             <script n:inner-foreach="$flashes as $flash">
                 flashMessage({$flash->message}, {$flash->type});
             </script>
{/snippet}

Kam přesně mám vložit tohle?

public function flashMessage(message, type) {

       $.toast({
       heading: 'Welcome to Ample admin',
       text: message,
       position: 'top-right',
       loaderBg: '#fff',
       icon: type,
       hideAfter: 3500,
       stack: 6
       })
   }

Editoval jAkErCZ (12. 12. 2017 18:24)

GEpic
Člen | 562
+
+1
-

Do nějakého externího .js souboru a ten si přilinkuj do své šablony

jAkErCZ
Člen | 321
+
0
-

GEpic napsal(a):

Do nějakého externího .js souboru a ten si přilinkuj do své šablony

To jsem udělal a nic se neděje jen chyba…

Hodil jsem si to do script.js

<script>
(function($) {
    "use strict";

    function flashMessage(message, type) {
                // toat popup js
                $.toast({
                    heading: 'Welcome to Ample admin',
                    text: message,
                    position: 'top-right',
                    loaderBg: '#fff',
                    icon: type,
                    hideAfter: 3500,
                    stack: 6
                })
    }

})(jQuery);

</script>

Chyba
?_fid=qpl8:80 Uncaught ReferenceError: flashMessage is not defined

Editoval jAkErCZ (12. 12. 2017 18:58)

GEpic
Člen | 562
+
0
-

V externím JS souboru nepotřebuješ <script> tagy a nemůže ti to najít funkci protože si jí obalil (a hlavně z fleku odpálil) do (function($) {})(jQuery); (což bys vůbec neměl používat pokud nevíš, co to dělá) čímž si znemožnil přístup k funkci z vnějšku mimo tento ‚obalovač‘ (anonymous self-invoking function). Prostě vem to function flashMessage, dej to do externího souboru a ničim to neobaluj, nic k tomu nedopisuj a bude to v pohodě (funkce tím pádem bude globální).

Editoval GEpic (13. 12. 2017 8:16)

jAkErCZ
Člen | 321
+
0
-

GEpic napsal(a):

V externím JS souboru nepotřebuješ <script> tagy a nemůže ti to najít funkci protože si jí obalil (a hlavně z fleku odpálil) do (function($) {})(jQuery); (což bys vůbec neměl používat pokud nevíš, co to dělá) čímž si znemožnil přístup k funkci z vnějšku mimo tento ‚obalovač‘ (anonymous self-invoking function). Prostě vem to function flashMessage, dej to do externího souboru a ničim to neobaluj, nic k tomu nedopisuj a bude to v pohodě (funkce tím pádem bude globální).

Dal jsem to do vlastního js ve kterým sem hodil jen tu funkci… implementoval jsem to do layoutu a pokusil přihlásit a má mi to přihlášení vyhodit zprávu a nic opět ta stejná chyba…

Uncaught ReferenceError: flashMessage is not defined

Už fakt nevím co dělám blbě?

jAkErCZ
Člen | 321
+
0
-

Ale pokud vytahnu z te funkce jen to zobrazování zprávy tak po reloadu stránky mi to toast vypíše v pohodě ale jen v te funkci nefunguje…

Proč kdyz píšeš ze je to tak jednoduchý?

jiri.pudil
Nette Blogger | 1028
+
+2
-

Však už ti to @GEpic napsal: funkci flashMessage máš definovanou uvnitř další funkce (function ($) { ... }), takže je dostupná jen uvnitř té funkce. Musíš ji přiřadit do globálního objektu, pak bude dostupná v globálním objektu:

window.flashMessage = function (message, type) { ... }
jAkErCZ
Člen | 321
+
0
-

Však tu funkci jsem již vytáhl z te jQuary a hodil do vladtniho js ale nedal sem ji jako window.flashMessage = function {…}

Mi řekl jen ať ji tam proste jako celek hodim.. to ze před ni mám ještě něco dat sem nevěděl… :D

David Matějka
Moderator | 6445
+
+1
-

to window.flashMessage je nutne, jen pokud neni v globalnim scope (tedy pokud je napriklad v tom (function ($) {...})(jQuery). pokud by to bylo na top level v tom souboru, tak to neni nutne

GEpic
Člen | 562
+
0
-

jAkErCZ napsal(a):

Však tu funkci jsem již vytáhl z te jQuary a hodil do vladtniho js ale nedal sem ji jako window.flashMessage = function {…}

Mi řekl jen ať ji tam proste jako celek hodim.. to ze před ni mám ještě něco dat sem nevěděl… :D

Stačí jí hodit i jen tak, jen ten JS soubor musíš logicky načíst dřív, než začneš tu funkci volat. :)

jAkErCZ
Člen | 321
+
0
-

GEpic napsal(a):

jAkErCZ napsal(a):

Však tu funkci jsem již vytáhl z te jQuary a hodil do vladtniho js ale nedal sem ji jako window.flashMessage = function {…}

Mi řekl jen ať ji tam proste jako celek hodim.. to ze před ni mám ještě něco dat sem nevěděl… :D

Stačí jí hodit i jen tak, jen ten JS soubor musíš logicky načíst dřív, než začneš tu funkci volat. :)

A jak ho mohu načítat dřív než budu volat když ho mám mít v svém vlastní js?

Takto to mám v layout

<?php
        {snippet flashMessages}
            <script n:inner-foreach="$flashes as $flash">
                    flashMessage({$flash->message}, {$flash->type});
            </script>
        {/snippet}
?>

v test.js

<script>


function flashMessage(message, type) {
        // toat popup js
        $.toast({
            heading: 'Welcome to Ample admin',
            text: message,
            position: 'top-right',
            loaderBg: '#fff',
            icon: type,
            hideAfter: 3500,
            stack: 6
        })
    }


</script>

Script v tom souboru námám!!!!

A stále chyba

Uncaught ReferenceError: flashMessage is not defined
    at ?_fid=c4al:78

/--HTML

Stále mi tu píšete to stejné a já to dělám tak jak mi GEpic řekl ;)

A co na tom dělám špatně?

Editoval jAkErCZ (14. 12. 2017 17:02)

iguana007
Člen | 970
+
+1
-

Tak to udelej takhle a mas klid:

		<script>
		function flashMessage(message, type) {
		        // toat popup js
		        $.toast({
		            heading: 'Welcome to Ample admin',
		            text: message,
		            position: 'top-right',
		            loaderBg: '#fff',
		            icon: type,
		            hideAfter: 3500,
		            stack: 6
		        })
		    }
		</script>
{snippet flashMessages}
    <script n:inner-foreach="$flashes as $flash">
            flashMessage({$flash->message}, {$flash->type});
    </script>
{/snippet}
iguana007
Člen | 970
+
0
-

Nebo takto:

		<script src="test.js"></script>
{snippet flashMessages}
    <script n:inner-foreach="$flashes as $flash">
            flashMessage({$flash->message}, {$flash->type});
    </script>
{/snippet}
jAkErCZ
Člen | 321
+
0
-

iguana007 napsal(a):

Nebo takto:

		<script src="test.js"></script>
{snippet flashMessages}
    <script n:inner-foreach="$flashes as $flash">
            flashMessage({$flash->message}, {$flash->type});
    </script>
{/snippet}

Když jsem to dal takto tak opět ta chyba s tím načítáním… ale to před tím fungovalo tak nechápu…

jAkErCZ
Člen | 321
+
0
-

Vyřešeno :) díky všem za pomoc :)

kleinpetr
Člen | 480
+
0
-

Zdravim,

vim, ze je to uz starsi vlakno, ale narazim na zajimavy problem. Mam klasicky zapis

<script>
    {foreach $flashes as $flash}
    toastr[{$flash->type}]({$flash->message});
    {/foreach}
</script>

a pokud zavolam ajaxem nejaky handle, tak se flashka vypise v poradku, ale kdyz odeslu form ajaxem, a vrati nejakou flashku, tak mi hodi error, ze nezna funkci toastr, coz je divny. Jaky je rozdil mezi ajaxovym zpracovani signalu oproti formulari ?

Diky za pomoc.

GEpic
Člen | 562
+
0
-

@kleinpetr to je zvláštní, vyřešil si to nějak?

CZechBoY
Člen | 3608
+
0
-

Nevypisou se ty volani toasteru driv nez nacitas knihovnu?

kleinpetr
Člen | 480
+
0
-

Ano, problem byl naprosta blobst, pouze mi form vracel danger type a ten toastr nezna.. :D