Autor Zpráva
Háva
Profil
Ahoj,
Mám katalog kde mám zobrazeny výrobky, u každého mám odkaz na přidání do košíku. Rád bych aby po kliknutí na přidání vyjel informativní DIV o tom že zboží bylo přidáno.
Zkouším to přes
<script>
function zobrazSkryj(idecko){
el=document.getElementById(idecko).style; 
el.display=(el.display == 'block')?'none':'block';
}
</script>
Ale DIV mi akorát problikne a hned zmízí, jak bych to měl upravit?
Tady mám ten odkaz:
<a href='' title='Vložení výrobku do košíku'><img src='images/hlavni/kosik.png' alt='Nákupní košík' class='kosik'] onclick=";?>"zobrazSkryj('oddil1')"<?php echo "></a>
Děkuji
Str4wberry
Profil
Na to nejspíš přepínání ani nepotřebuješ.
Háva
Profil
Ale takto mi to problikne také, asi to blbě vkládám. Abych to upřesnil: Mám kosik.php kde kliknu na odkaz kterým si předávám ID a akce=pridej, na základě toho s mi spustí script který je v inkludovaným souboru zpracuj_kosik.php pro zápsání do DB
Odkaz:
<a href='$kosik' title='Vložení výrobku do košíku'><img src='images/hlavni/kosik.png' alt='Nákupní košík' class='kosik'] onclick=";?>\"javascript:nastavit('show');\"<?php echo "></a>

$kosik="katalog.php?akce=pridej";
$kosik.="&amp;id=".$zaznam["id"];
$kosik.="&amp;k=$k";

No a ty dva sripty mi nejdou propojit s tím javasriptem

Když dám odkaz jenom takto: <a href=\"javascript:nastavit('show');\">Přidat do košíku</a> tak to jde ale zas se mi neinkluduje soubor s těma parametrama co potřebuji.
Str4wberry
Profil
Jestli to dobře chápu, tak musíš to přidání obsloužit AJAXem, aby ses vyhnul onomu probliknutí.
Háva
Profil
Aha, ale AJAX ja vůbec neovládám mohl by jsi mi to nějak ukázat?
Str4wberry
Profil
Můžeš použít tuto funkci nacti od Chamurappiho a použít ji lehce upraveným způsobem:
function pridej(id) {
    nacti("katalog.php?akce=pridej&id=" + id, function (odpoved) {
        alert(odpoved);
    });
}
<a href="javascript:pridej(<?=$zaznam["id"]?>);">Přidat do košíku</a>
Případně si místo toho alertu zobrazit <div> a dát do něho obsah proměnné odpoved.
Háva
Profil
Nevim ale tohle mi nedela nic neni v tom nejaka chybka?
Když to mám vše v jednom souboru tak to jde ale jakmile dám ten DIV pro zobrazení do toho inkludovaného tak to nic neudělá. Přijde mi že nebere v potaz ten odkaz v této funkci
function pridej(id) {
    nacti("katalog.php?akce=pridej?id=" + id, function (odpoved) {
        alert(odpoved);
    });
}
Dole v infu stránky vidím že to odkazuje pouze na javascript:pridej(2) a asi by tam měla být i ta stránka katalog.php....
Háva
Profil
Tak nakonec pomoho místo: nacti("katalog.php?akce=pridej?id=" toto: nacti("katalog.php?akce=pridej&id=".
Akorát bych ještě potřeboval aby se mi po provedení všech těchto příkazů stránka znovu načetla aby se mi ty změny v DB hned zorazili. Sice to vše funguje ale změnu vdím až po stisku F5. Lze to nějak nastavit?
_es
Profil
Háva:
aby se mi po provedení všech těchto příkazů stránka znovu načetla
Tak potom nepotrebuješ AJAX ([#4] Str4wberry), ale normálne znovunačítanie stránky cez normálny odkaz alebo cez formulár a všetky potrebné zmeny na stránke sprav na serveri - v PHP.

aby se mi po provedení všech těchto příkazů stránka znovu načetla aby se mi ty změny v DB hned zorazili.
Na zapísanie do databázy ani na nejakú zmenu stránky sa predsa nemusí znovu načítať celá stránka, ak si tú vetu myslel tak. Prečítaj si niekde, na akom princípe funguje AJAX.
Háva
Profil
Tak sem si trošku přečetl o AJAXU a už je mi jasný alespoň ten princip, že slouží vlastě k tomu abych nemusel vše znovu načítat. Mě ani nejde o načtení celé té stránky ale pouze o kus kódu u košíku aby uživatel viděl jak se mu změnil. To mám ten kód taky spojit s AJAXEM?
_es
Profil
Háva:
To mám ten kód taky spojit s AJAXEM?
Ako spojiť? AJAX je len názov toho princípu, v tvojom prípade:
JS odošle nejaké dáta PHP skriptu, ten tie dáta, za určitý čas, nejako spracuje, trebárs môže aj niečo zapísať do databázy, JS prijme nejaké dáta z odpovedi PHP skriptu a nejako ich spracuje, trebárs tak, že zobrazí zmeny v „košíku“.
Háva
Profil
_es:
A jak by měl teda vypadat ten JS pro zobrazení změny v košíku? Teď to mám že JS odešle data z katalog.php do kosik_zpracuj.php ten zpracuje uložení do DB a následě vypíše DIV o přidání a tím mi to končí na katalog.php bez načítání. Informace o košíku inkluduju do katalog.php
_es
Profil
Háva:
Informace o košíku inkluduju do katalog.php
Ako „inkluduješ“? Veď si sprav PHP skript len čisto na komunikáciu ohľadom stavu košíka medzi serverom a prehliadačom (JS).

a následě vypíše DIV o přidání
Tak môže predsa následne aj aktualizovať stav košíka v prehliadači - rovnako ako „vypísal DIV“.
Háva
Profil
_es:
Mám to takhle toto je soubor katalog.php
<style>
.hide {display: none}
.show {display: block}
</style>
 
<script>
function nastavit(viditelnost, obsah) {
    var tvujDiv = document.getElementById('status');
  tvujDiv.className = viditelnost;
  tvujDiv.getElementsByTagName("div")[0].innerHTML = obsah;
}
function nacti(url, callback)
{
  var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
  xhr.open("GET", url, true);
  xhr.onreadystatechange = function()
  {
    if(xhr.readyState == 4)
      callback(xhr.responseText);
  };
  xhr.send("");
}
function pridej(id) {
    nacti("kosik_zpracovani.php?akce=pridej&id=" + id, function (odpoved) {
        // alert(odpoved);
    nastavit('show', odpoved);
    });
}
</script>


<div id="main">
   <div id="levastrana">
       <?php include "leve-menu.php";?>
   </div> 
   <div id="prostredek">
       <?php 
           ....      
          echo "<a href="javascript:pridej(<?php echo "".$zaznam['id']."";?>);"<?php echo "><img src='images/hlavni/kosik.png' alt='Nákupní košík' class='kosik']></a>";
          ....
       ?>
       <div id="status" class="hide">
          Zboží přidáno<br>
          <a href="javascript:nastavit('hide', '')">zavřít</a> 
       </div>
   </div> 
   <div id="pravastrana">
     <?php include "prava.php";?>
   </div> 
</div>

Zatím mi jde toto: Kliknu na ikonu košíku, JS mi spustí script kosik_zpracovani.php a po jeho dokončení se mi zobrazí DIV z katalog.php : Zboží přidáno.
Informace o tom kolik je ale cena a kusů v košíku mám inkludované v leve-menu.php. Jak mám tedy udělat aby se mi to zaktualizovalo?
Snad sem to popsal good už sem vtom úplně stracenej.
_es
Profil
Háva:
JS mi spustí script kosik_zpracovani.php
Tak si uprav PHP skript kosik_zpracovani.php, tak, aby vrátil také dáta, ktoré využiješ vo funkcii predanej ako druhý argument do funkcie nacti ([#6] Str4wberry), tak, aby sa košík aktualizoval. Samozrejme si na to musíš tú funkciu vhodne upraviť.

po jeho dokončení se mi zobrazí DIV z katalog.php
Ako „sa zobrazí DIV z katalog.php“? Veď voláš skript kosik_zpracovani.php. Najprv by si si mal ujasniť, kedy voláš aký PHP skript, čo ti vracia, a kedy aký JS kód beží, aby si sa v tom vyznal.
Háva
Profil
_es:
„Tak si uprav PHP skript kosik_zpracovani.php“
To je právě to v čem sem úplně stracenej, vůbec netuším co bych tam měl dát.

„po jeho dokončení se mi zobrazí DIV z katalog.php“
No sice volam kosik_zpracovani.php ale když ten DIV umístím tam tak se nezobrazí a zobrazí se akorat když ho mám v katalog.php
_es
Profil
Háva:
Znovu, trochu inak: To, čo odošleš v GET parametroch (za otáznikom) PHP skriptu kosik_zpracovani.php, záleží len od teba. Rovnako záleží od teba, ako tie odoslané dáta ten PHP skript spracuje, čo spraví a čo vráti - to spracuje funkcia predaná ako druhý argument do funkcie nacti - napríklad v [#6] vypíše hlášku s vráteným textom - no ty namiesto toho spravíš aktualizáciu košíka.

To je právě to v čem sem úplně stracenej, vůbec netuším co bych tam měl dát.
No však nejaký zápis do nejakej databázy, prípadne načítanie dát z databázy, vrátenie nejakých dát v nejakom rozumnom tvare, aby ich JS ľahko spracoval...
Ak sa v tom cítiš stratený, tak by možno stálo za to pouvažovať, či nie je tvorba e-shopu nad tvoje sily, lebo si na to ešte nenaštudoval dosť materiálov, prípadne ho spraviť bez JS - ak je len ten kritické miesto.
Háva
Profil
_es:
Tak jsem si předělal ten JS aby mi načítal script s košíkem do DIVU. Funguje mi to a ten sript se mi tam načítá, nicméně se mi načetl jenom jednou a teď když v tom scriptu něco změním tak se mi ta změna neprojeví a je to pořád stejné jako to první načtení.

nacti('kosik.php','kosik');

Čili soubor kosik.php se mi zobrazí v Divu kosik ale jakmile něco změním ve srciptu kosik.php tak se mi ta změna neprojeví, nenačte.

Co s tím?
_es
Profil
Háva:
nacti('kosik.php','kosik');
Funkcia nacti, na ktorú ťa v [#6] Str4wberry odkázal, má druhý argument funkciu.
Háva
Profil
To vím já jsem si ji upravil aby to přímo směřovalo do toho divu kosik
function nacti(stranka, kam)
{

    var httpRequest;
    
    if(typeof window.ActiveXObject != 'undefined')
    {
        httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {  
        httpRequest = new XMLHttpRequest();
    }
    httpRequest.open("GET", stranka, true);
    httpRequest.onreadystatechange= function () 
    {
        processRequest(httpRequest, kam) 
    };
    httpRequest.send(null);
}}
Takto to přece je že první parametr je stránka a druhý je nazév Divu kam se to umístí ne?
_es
Profil
Háva:
processRequest(httpRequest, kam)
No a funkcia processRequest je definovaná kde a robí čo?

ale jakmile něco změním ve srciptu kosik.php
Ako, čo, kde zmeníš?
Háva
Profil
Takto je celý javasript:
function nacti(stranka, kam)
{

    var httpRequest;
    
    if(typeof window.ActiveXObject != 'undefined')
    {
        httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
    {  
        httpRequest = new XMLHttpRequest();
    }
    httpRequest.open("GET", stranka, true);
    httpRequest.onreadystatechange= function () 
    {
        processRequest(httpRequest, kam) 
    };
    httpRequest.send(null);
}

function processRequest(httpRequest, kam) 
{
    if (httpRequest.readyState == 4)
    {
        if (( httpRequest.status >= 200 && httpRequest.status < 300 ) || httpRequest.status == 304)
        {
            if (typeof kam == 'string') 
            {
                document.getElementById(kam).innerHTML = httpRequest.responseText;
            }
            if (typeof kam == 'function') 
            {
                kam(httpRequest.responseText);
            }
        }
        else
        {
            alert("Chyba pri nacitani stanky " + httpRequest.status +" : "+ httpRequest.statusText);
        }
    }
    else
    {
        if (typeof kam == 'string' && kam != '') 
        {
            document.getElementById(kam).innerHTML = 'čekejte...';
        }
    }
       
}  
No a když třeba v kosik.php přidám nějaký text nebo zapíšu do DB tak se mi ta změna neprojevuje.
A ještě jedna věc místo českých znaků tam mám černé otazníky, musím někde změnit kódování?
_es
Profil
Háva:
když třeba v kosik.php přidám nějaký text nebo zapíšu do DB tak se mi ta změna neprojevuje.
Ako „neprejavuje“? Tak predsa, ak niečo zmeníš v PHP skripte, tak sa musí najprv do prehliadača po jeho zmene znovu načítať, aby bola jeho zmena nejako zobrazená. Alebo to je len v niektorých prehliadačoch? Potom by možno pomohlo: Je problém v cachování?
Nejaký je v tom chaos. Ktorý PHP skript vlastne vracia aktuálny stav košíka? Najprv AJAXom načítavaš katalog.php, potom kosik_zpracovani.php, potom kosik.php - aby sa v tom niekto vyznal. Mal by si najprv ujasniť, čo sa deje v prehliadači a čo na serveri.
Obávam sa, že sú tvoje vedomosti na vytvorenie e-shopu nedostatočné a mal by si si toho najprv trochu viac naštudovať, než začneš robiť takú náročnejšiu vec.

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: