Vyvolání toast message z presenteru
- Pavel Janda
- Člen | 977
@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ž?
- rerege
- Člen | 58
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
- jak v tom ProductPresenteru zavolat tu mojí komponentu
není někde nějaký jednoduchý příklad?
- 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 | 566
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)
- CZechBoY
- Člen | 3608
Je tu i pár dalších rozšíření/komponent, které řeší flash
zprávy:
http://blog.honzacerny.com/…te-framework
- jAkErCZ
- Člen | 322
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)
- jAkErCZ
- Člen | 322
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 | 566
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 | 322
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 tofunction 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ě?
- jiri.pudil
- Nette Blogger | 1032
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) { ... }
- David Matějka
- Moderator | 6445
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 | 566
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 | 322
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
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}
- jAkErCZ
- Člen | 322
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…
- kleinpetr
- Člen | 480
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.