Do nového roku jako lepší programátoři? Znovu otevíráme večerní školu programování. Nette framework, návrhové vzory, testování nebo vůbec poprvé kurzy ASP.NET dostupné odkudkoli v republice.
Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Ahoj.
Když uživatel na mé stránce v administraci zvolí smazání dat z databáze, chci mu ještě vyhodit potvrzovací hlášku ano/ne, zda to chce opravdu smazat, aby nedošlo k nechtěnému zmáčknutí smazat. Jak se to dá šikovně ošetřit přes PHP, když mazací tlačítka se generují přes PHP do tabulky podle počtu záznamů, takže vše v tabulce i políčko smazat je pomocí příkazu echo.

Má někdo nějaký nápad nebo to jinak než přes JS nepůjde? Zkoušel jsem do <a href..> vložit nějak onclick, ale nefunguje to a háže to chybu už v NetBeans.

Díky

 
Odpovědět 1.3.2015 13:03
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Michal Kuba
Matúš Petrofčík:

ja som dával na <a> alebo <input type="submit"> alebo <button> toto:

onclick="return confirm('Skutočne?')"

napr:

<input type="submit" name="delete_submit" onclick="return confirm('Skutočne?')" value="Zmazať" />
Nahoru Odpovědět  -1 1.3.2015 13:11
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Matúš Petrofčík
Michal Kuba:

když dám například na to <a> onlick tak mi to háže chybu. Jak to začlenit do tohoto řádku? :

 <?php
..
echo( '<td style="width: 160px;border:none;"><a href="administrace.php?odstranit=' . htmlspecialchars($inzerat['ID']) . '"><img src="../img/ikony/smazat.png"></a></td>');
?>
 
Nahoru Odpovědět 1.3.2015 13:12
Avatar
Odpovídá na Michal Kuba
Denis Homolík (Alfonz):

Samozřejmě, že to bez JS půjde. Uživatel odešle požadavek na smazání a ty místo toho aby jsi ho smazal vygeneruješ stránku na které bude Ano/Ne tlačítka. Ano záznam smaže a Ne tě vrátí zpět. Ale podle mě je mnohem uživatelsky příjemnější vyhodit v JS okno které se tě zeptá :)

Nahoru Odpovědět 1.3.2015 13:14
Vše je možné, dokud si to myslíte!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Denis Homolík (Alfonz)
Michal Kuba:

No a tak jak to má na mysli Matúš Petrofčík to nejde zařídit? Snažím se tam nacpat nějak to onclick ale nechce to jít :/

 
Nahoru Odpovědět 1.3.2015 13:16
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Michal Kuba
Matúš Petrofčík:

Tebe to asi píše chybu lebo tam máš veľa " a ', musíš si niektoré z nich escapovať ;) to preto

<?php
..
echo( '<td style="width: 160px;border:none;"><a onclick="return confirm(\'Skutočne?\')"href="administrace.php?odstranit=' . htmlspecialchars($inzerat['ID']) . '"><img src="../img/ikony/smazat.png"></a></td>');
?>

snáď tak nejako by to mohlo ísť... ak nie tak uzatváraj string do " a escapuj všetky " znaky v stringu... trochu viac námahavé

alebo nech ti niekto iný poradí iný spôsob

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +4 1.3.2015 13:17
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Matúš Petrofčík
Michal Kuba:

Byl tam problém s těmi apostrofy a už to funguje! :) díky, přesně takovéto jednoduché řešení jsem chtěl.

 
Nahoru Odpovědět  +1 1.3.2015 13:21
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Michal Kuba
Matúš Petrofčík:

Nie je to síce ideálne, pretože tam vyskakuje tá divná hláška ktorú si nevieme naštýlovať, ale myslím že to stačí, veď na ČSFD to majú rovnako :) není zač

Nahoru Odpovědět 1.3.2015 13:26
obsah kocky = r^2 ... a preto vlak drnká
Avatar
danhosek
Člen
Avatar
danhosek:

Ahoj, mám problém s confirm. Hláška se otevře, ale at dám jakoukoli možnost požadavek se vždy vykoná.
odkaz je pomocí ajax:

<a class="ajax" n:href="deleteImage! $reference->url, $reference->images_count, $i" data-confirm="Opravdu si přejete odstranit vybraný obrázek?">Odstranit</a>

js souborů je nalinkováno víc v pořadí:

<script src="{$basePath}/js/scrollreveal/scrollreveal.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="{$basePath}/www/js/netteForms.js"></script>
    <script src="{$basePath}/www/js/nette.ajax.js"></script> {* Nette Ajax depens on jQuery *}
        <script src="https://nette.github.io/resources/js/netteForms.min.js"></script>
        <script src="{$basePath}/www/js/main.js"></script>
    <script src="{$basePath}/js/main_2.js"></script>
    <script type="text/javascript" src="{$basePath}/js/confirm.js"></script>
    <script src="http://blueimp.github.io/Gallery/js/jquery.blueimp-gallery.min.js"></script>

a v confirm.js:

$(function () {
    $("a[data-confirm]").click(function (e) {
        if (!confirm($(this).data('confirm')))
            e.preventDefault();
    });
});

Způsobuje to ajax, že se požadavek z odkazu pokaždé vykoná, nebo může to být problém tím, že se js soubory mezisebou tlučou?
Děkuji za pomoc.

 
Nahoru Odpovědět 13.12.2016 1:38
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na danhosek
TomasGlawaty:

Ahoj,
Nejsem si úplně jist, ale nejspíše to je tak, ze tento event akci zastaví, ale event, který navesil nette.ajax.js se provede. Zkus tu část s confirmem přepsat jak nette ajax extension (popsáno to je v dokumentaci na GitHubu).
Btw mas tam 2x prilinkovane netteForms.js

Nahoru Odpovědět 13.12.2016 6:33
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
danhosek
Člen
Avatar
Odpovídá na TomasGlawaty
danhosek:

přehlédl jsem že tam mám netteForms 2x děkuji, ale moc nerozumím tomu, co bych měl udělat, aby mi confirm fungoval jak má. Nikde jsem nenašel, že by se někde řešil stejný problém. Programovat v JS neumím a nevím si stím příliš rady. Prosím tedy o něaké nasměrování, nebo podrobnější popsání, co stím mám dělat. Děkuju.

 
Nahoru Odpovědět 13.12.2016 7:37
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na danhosek
TomasGlawaty:

Hledáš asi špatně :)
Asi se budeš muset trochu i JS naučit.
Směřoval jsem tě na GH https://github.com/…er/readme.md
Konkrétně sekce "Extensions". Můžeš pro Nette ajax nadefinovat "rozšíření", což je vlastne jenom překrytí základních eventů z jQuery. Tyto eventy se spouštějí s každým requestem, který jde skrze Nette ajax. Využil bych konkrétně event "before", který se volá pred posláním requestu a v případě, ze vratiš False, tak se neprovede. Samozřejmě chceš confirm zobrazovat jen u odkazů s data-confirm. Takže si z parametru "settings" eventu "before" vytahneš element, který ajax "odpálil", zkontroluješ tento data atribut, případně zobrazíš confirm a vratíš True/False.
Na Nette fóru je odledně Nette.ajax poměrně rozsáhlé téma a tam určite vse je. Jsem ted na telefonu, takže ukázku zdrojového kódu se mi na něm psát nechce :)

Nahoru Odpovědět  +1 13.12.2016 18:22
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
danhosek
Člen
Avatar
Odpovídá na TomasGlawaty
danhosek:

nemohl jsem nic najít, protože jsem nevěděl co hledat a hledal jsem nesprávné věci :-D našel jsem si toto:
https://craftpip.github.io/jquery-confirm/#…
konkrétně toto okno:

$.confirm({
    title: 'Confirm!',
    content: 'Simple confirm!',
    buttons: {
        confirm: function () {
            $.alert('Confirmed!');
        },
        cancel: function () {
            $.alert('Canceled!');
        },
        somethingElse: {
            text: 'Something else',
            btnClass: 'btn-primary',
            keys: ['enter', 'shift'],
            action: function(){
                $.alert('Something else?');
            }
        }
    }
});

Ale vubec z toho nechápu, jak to použít(jak bude vypadat odkaz...)
Pak jsem našel tuto diskuzi o řešení tohoto problému:
http://stackoverflow.com/…with-confirm
kdecfunkční výsledek by měl být takový:
Odkaz:

<a href="#" class="removeItem delete">remove</a>

a js kod:

$('.delete').click(function () {
    confirm('Are you sure you want to delete this?');
});


$('.removeItem').click(function (event) {
    event.preventDefault();

    $.ajax({
        url: 'myUrl',
        type: "POST",
        data: {
            // data stuff here
        },
        success: function () {
            // does some stuff here...
        }
    });
});

Ale nevím, jak to upravit, aby fungoval můj původní odkaz:

<a class="ajax" n:href="deleteImage! $reference->url, $reference->images_count, $i" data-confirm="Opravdu si přejete odstranit vybraný obrázek?">Odstranit</a>

přidám dám pryč class="ajax"a nahradím názvem funkce a v kodu js to změním takto?:

$.ajax({
        url: 'dodeleteImage&$reference->url&$reference->images_count&$i"',
        type: "GET",
        data: {
            // data stuff here
        },
        success: function () {
            // does some stuff here...
        }

pro každý odkaz s potřebou potvrzení si udělám novou funkci s jinými požadavkami a hláškou. Nebo jak na to správně? Bylo by možné ukázat mi kod, jak by vapadal původní odkaz v tomto příkladu?
Děkuji mnohokrát.

 
Nahoru Odpovědět 14.12.2016 0:10
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na danhosek
TomasGlawaty:

Četl jsi vůbec, co jsem psal? evidentně jen první větu...

// link
<a n:href="yourHandle!" class="ajax" data-ajax-confirm="Really?">click me</a>
....

// After call $.nette.init();
$.nette.ext('confirm', {
        before: function (xhr, settings) {
            if (!settings.nette)
                return;

            var question = settings.nette.el.data('ajax-confirm');
            if (question)
                return confirm(question);
        }
});

Tohle je jedno z mnoha možných řešení a zároveň řešení, ke kterému jsem tě celou dobu vedl.

Nahoru Odpovědět  +1 14.12.2016 16:36
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
danhosek
Člen
Avatar
Odpovídá na TomasGlawaty
danhosek:

Děkuji mnohokrát. Tohle bych dohromady nikdy nedal. Ale ještě mám jednu prosbičku.
Zjistil jsem, že mi toto nefunguje jak má ani u neajaxového odkazu na smazání.
Tvé řešení jsem umístil takto:
main.js:

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

$.nette.ext('confirm', {
    before: function (xhr, settings) {
        if (!settings.nette)
            return;

        var question = settings.nette.el.data('ajax-confirm');
        if (question)
            return confirm(question);
    }
});

A pro ajaxové odkazy funguje bezchybně, jak to upravím i pro neajaxové odkazy?

 
Nahoru Odpovědět 15.12.2016 2:06
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na danhosek
TomasGlawaty:

Jedná se o extension nad ajaxovými požadavky, takže to funguje jen pro ajax. Pro neajaxové odkazy musíš dopsat další event, např.:

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


        $.nette.ext('confirm', {
            before: function (xhr, settings) {
                if (!settings.nette)
                    return;

                var question = settings.nette.el.data('confirm');
                if (question)
                    return confirm(question);
            }
        });

        $(document).on('click', '[data-confirm]:not(.ajax)', function () {
                var question = $(this).data('confirm');
                if (question)
                    return confirm(question);
        });
});
Nahoru Odpovědět 15.12.2016 12:34
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
danhosek
Člen
Avatar
Odpovídá na TomasGlawaty
danhosek:

omlouvám se, že se ptám jak uplnej blbec, ale prostě v JS nejsem zběhlý.
main.js upravený na:

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


    $.nette.ext('confirm', {
        before: function (xhr, settings) {
            if (!settings.nette)
                return;

            var question = settings.nette.el.data('confirm');
            if (question)
                return confirm(question);
        }
    });

    $(document).on('click', '[data-confirm]:not(.ajax)', function () {
        var question = $(this).data('confirm');
        if (question)
            return confirm(question);
    });
});

a odkaz pomocí ajaxu:

<a n:href="deleteImage! $reference->url, $reference->images_count, $i" class="ajax" data-ajax-confirm="ODSTRANIT vybraný obrázek?"></a>

odkaz bez ajaxu:

<a n:href=":Core:Reference:remove $reference->url" data-confirm="ODSTRANIT vybranou referenci?">Odstranit referenci</a>

Nebo jak to má být správně po úpravě? Protože mi to takto nefunguje správně...

 
Nahoru Odpovědět 15.12.2016 16:14
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na danhosek
TomasGlawaty:

V pohode.
Ten ajaxový odkaz teď nefunguje, protoze jsem změnil ten název data-* atributu z "data-ajax-confirm" na "data-confirm" (ať je u obou druhu odkazů pojmenován stejně).

Nahoru Odpovědět 15.12.2016 16:25
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
danhosek
Člen
Avatar
Odpovídá na TomasGlawaty
danhosek:

měl jsem problem s obnovením js...prohlížeč si ho pamatoval:-D
Ale nyní již vše funguje jak má. Mockrát děkuji za trpělivost a ochotu pomoct. Mrzí mi, že toto vlákno je již uzavřené a nemohu ti dát ukončující řešení, ale mám založené vlákno, kde jsem tento problem řešil puvodně, které nění ještě ukončené, tak můžeš něco napsat tam ( Confirm okno) a dán ti body za řešení.

 
Nahoru Odpovědět  +1 15.12.2016 18:16
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na danhosek
TomasGlawaty:

V pohode, neni zač ;)
btw to neřeš, o nejake body mi tu nejde ...

Nahoru Odpovědět  +1 15.12.2016 23:08
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 20 zpráv z 20.