Autor Zpráva
gardener
Profil
Zdravím, chtěl bych se zeptat, jak vyřešit situaci kdy:
-Mám výpisy záznamů z db to tabulky
-u každého možnost smazání
-Po kliku na odkaz smazat zobrazit confirm zprávu uživateli
-Po kliku zavolat fci, ktera provede smazani, pokud vrati true tak provede refresh


Drive jsem to resil confirmem a pri true jsem zavolal jenom php skript, kam sem predal id zaznamu, to ale uzivtele prenese na stranku se skriptem a to uz bych ted delat nechet:)

Diky za kazdou radu
Chamurappi
Profil
Reaguji na gardenera:
Nevím, zda jsem tě správně pochopil, ale můžeš ten odkaz targetem nasměrovat do <iframu> (třeba skrytého).
Jinak tedy nevím, s čím bys chtěl při takto nekonkrétním zadání poradit. Uprav si tu svoji JS funkci, o které nevíme vůbec nic a která dělá to, co nechceš, tak, aby dělala to, co chceš.

to uz bych ted delat nechet:)
Nehet se píše s „h“. Piš prosím s diakritikou.
gardener
Profil
Aha, to s iframem me nenapadlo..ale nicmene to neni presne to co bych chtel.

Mel jsem na mysli neco v tom smyslu, ze se skript provede na 'pozadi', tzn aby uzivatel nebyl presmerovan, pouze informovan o provedeni/neprovedeni operace a refreshnuta stranka :

function confirmDelete(delId) {
  if (confirm("Are you sure you want to delete")) {
    document.write(<?php
$result = dibi::query('DELETE FROM  [tbl_seminars] WHERE [id]=%i LIMIT 1',$id);
//Jenze php takto proste do JS zapsat nemuzu..
    ?>)
  }
}
</script>

<a href="javascript:confirmDelete(1)">Delete</a>
_es
Profil
gardener:
Ani metódu document.write nie je možné rozumne použiť po procese načítania dokumentu.
Najjednoduchšie je to, čo ti radí Chamurappi, hlavný dokument zostane, len sa zmení skrytý iframe.
jksdf
Profil
Mohlo by sa to urobiť tak, že nedáš confirm, ale formulár v HTML. Potom jednoducho by odoslanie bolo action="#" a pri otvorení stránky by php skontrolovalo, či je formulár odoslaný, a ak áno, tak by urobilo vymazanie. Formulár by mohol byť skrytý, a po kliknutí (alebo ako to na stránke je) by sa zobrazil.
Chamurappi
Profil
Reaguji na gardenera:
to s iframem me nenapadlo..ale nicmene to neni presne to co bych chtel
Myslím, že bys to použít mohl, protože stránka načtená do <iframu> může celkem pohodlně komunikovat se svým rodičem, tedy i vyslat zprávu „je smazáno“.

Další snadná možnost je vyrobit dynamicky externí <script>:
var s = document.createElement("script");
s.src = "adresa-mazaciho-skriptu.php?id=" + id;
document.body.appendChild(s);
Výstupem PHP skriptu by pak bylo volání nějaké tvé další JS funkce, která přizpůsobí vzhled stránky, nebo třeba alert("Selhalo to.").


Reaguji na jksdfa:
On asi nechce, aby uživatel opustil aktuální zobrazení stránky, na adrese mu zřejmě tolik nezáleží.
gardener
Profil
Chamurappi ten napad s JS se mi libi, jen mi ale neni jasne, jak bych predal jako parametr id, pokud mam takovyto odkaz?

<script type="text/javascript">
//Delete user
   function delete_user(id) {
	   var s = document.createElement("script");
	   s.src = "delete_user.php?id=" + id;
	   document.body.appendChild(s);
   }
      </script>
<a href="delete_user.php?id=2" title="smazat článek" onclick="delete_user(id)" >Smazat</a>


Jedine, co mne napada, je predavat do href, pouze id a to pote predavat jako parametr fci jako this.href

Ale nejsem si jisty, jestli je to dobry napad..
Chamurappi
Profil
Reaguji na gardenera:
jen mi ale neni jasne, jak bych predal jako parametr id
Nemůžeš napsat normálně „onclick="delete_user(2)"“?

predavat do href, pouze id a to pote predavat jako parametr fci jako this.href
Tím myslíš, že bys z hrefu odmazal „delete_user.php?id=“, předal do své funkce this.href, v ní zase zpátky přidal k hrefu „delete_user.php?id=“ a to nastavil do s.src? Vskutku zajímavě vymyšlené.

nejsem si jisty, jestli je to dobry napad
Není.
gardener
Profil
o.k

Bohuzel se ale deje to, ze jsem vzdy presmerovan na script pro mazani, coz je presne to, cemu jsem se chtel tentokrat vyhnout.
Jak tedy vyresit aby se to odehralo na pozadi, aniz by musel byt uzivatel presmerovan?
To to vazne pujde jenom framem? Nebo na to musim pouzit AJAX?:)

<script type="text/javascript">
//Delete user
   function delete_user(id) {
	   var s = document.createElement("script");
	   s.src = "delete_user.php?id=" + id;
	   document.body.appendChild(s);
   }
      </script>
<title>Administrace</title>
</head>
<body>
<a href="" title="smazat článek" onclick="delete_user(2)" >Smazat</a>

A ve scriptu pro mazani
<?php
include './libs/nette-0.9-PHP-5.2/Nette/loader.php';
include './db_connect.php';
Debug::enable();
$id_of_user = $_GET["id"];
$result = dibi::query('DELETE FROM [tbl_users] WHERE [id] = %i',$id_of_user);
if($result)
echo "<script>
alert('o.k');
</script>";
else
echo "<script>
alert('n.o');
</script>";
?>
gardener
Profil
Pokud v hraf, neni primo odkaz, tak se volany src ve fci nenacte.
Chamurappi
Profil
Reaguji na gardenera:
Pokud nechceš odkazovat, nepoužívej odkaz — to je asi ta nejjednodušší rada. Událost onclick přeci funguje na všem, včetně tlačítka, které by možná bylo pro tuto situaci nejlepší.

Jinak samozřejmě jde zrušit výchozí akci i u odkazu.

Nebo na to musim pouzit AJAX?:)
Tohle v podstatě je AJAX. (I když bez XMLHttpRequestu.)
gardener
Profil
Mas pravdu, udelal jsme chybu v ponechani toho odkazu..

Jenze porad tady je problem s tim, ze pokud zavolam pmoci fce ten script pro mazani a ocekavam nejaky alert box se zpravou, o.k , nebo ne, tak se nedočkám i když je SQL dotaz úspěšně proveden..
Chamurappi
Profil
Reaguji na gardenera:
Prosím o odkaz na živou ukázku.
gardener
Profil
Ukázka je zde:
penzionadler.cz/try.php
K zavolání scriptu zde ale nedojde.
Chamurappi
Profil
Reaguji na gardenera:
Aha, ty jsi ignoroval, co jsem ti radil v příspěvku [#11].
gardener
Profil
Ach so, ty jsi myslel odkaz jako cely html tag..ja mel za to, ze jen atribut href ma byt prazdny..
Ale kazdopadne bez pouziti tlacitka by to slo tedy nejak?
Chamurappi
Profil
Reaguji na gardenera:
Ano, jde, viz příspěvek [#11].
gardener
Profil
To ano, jenže pořád nedostanu výstup o provedení úspěšnosti akce..tzn. například alert(o.k);
Chamurappi
Profil
Reaguji na gardenera:
Protože odkaz tě odvede na jinou stránku, protože jsi nezrušil jeho výchozí akci — viz příspěvek [#11].
gardener
Profil
Ale ano, return false; tam je uveden..script se provede..ale ja se uz nedozvim s jakym vysledkem..
Takhle je to správně ne?
echo "<td><a href=\"delete_seminars.php?id=".$row->id."\" onclick=\"delete_seminar($row->id);return false;\" title=\"smazat seminář\" >Smazat</td>\n";

Ono by tedy stejně mělo dojít ke smazání vždy, v tomto případě, ale jistota je jistota
Chamurappi
Profil
Reaguji na gardenera:
Na odkázané stránce nevidím return false. Nemám, co ladit a v čem hledat chybu, když to tam nenahraješ — to je snad jasné, ne?
gardener
Profil
Promin, nahral sem to tam..
Chamurappi
Profil
Reaguji na gardenera:
Stránka se ti znovunačítá, protože tam máš:
  window.location.reload();
Ten alert("Záznam byl smazán") má být až výstupem toho skriptu delete_user.php.
gardener
Profil
Já myslím, že si špatně rozumíme.
Ten reload je tam proto, že jsem chtěl vrátit alert se zprávou ano povedlo, ne nepovedlo.
Kdyz je alert zobrazen, beh JS preci nepokracuje ne? Po kliku na alert s vracenou hodnotou by se tedy provedl reload, tak aby se priadne zmeny projevili na vypisu.
Chamurappi
Profil
Reaguji na gardenera:
Já myslím, že si špatně rozumíme.
Já myslím, že jsem již řekl vše potřebné, viz [#6], řádek „Výstupem …“.
Momentálně je výstupem skriptu http://penzionadler.cz/delete_user.php?id=1 tlupa chybových hlášek.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: