webForumDet fria alternativet

Webbutik bygge och kak problem

18 svar · 500 visningar · startad av fredriksk

fredrikskMedlem sedan maj 2001211 inlägg
#1

Hello!
Går en kurs i php programmering/javascript.
Som projektarbete skall vi bygga en webbutik och jag håller nu på med att försöka få ihop själva köpdelen av den.

Själva kundkorgen skall implementeras med cookies och till detta har vi fått en klass tilldelad oss i en fil jag kallar kaka.js

Själv förstår jag inte riktigt hela klassen då jag är ganska färsk på javascript men det skall ju inte behövas heller. Koden till klassen ser ut så här:

function Kaka(document, name, hours, path, domain, secure) {
  this.$document = document;
  this.$name = name;

  this.$expiration=hours?new Date(new Date().getTime() + hours*36000000):null;
  this.$path=path?path:null;
  this.$domain=domain?domain:null;  
  this.$secure=secure?secure:null;
}

Kaka.prototype.store = function() {
  var cookieval="";
  for(var prop in this) {
    if (prop.charAt(0) == '$' || ((typeof this[prop]) == 'function'))
      continue;
    if(cookieval != "") cookieval+='&';
    cookieval += prop + ':' + escape(this[prop]);
  }
	
  var cookie = this.$name + '=' + cookieval;
  if(this.$expiration) cookie+=';expires='+this.$expiration.toGMTString();
  if(this.$path) cookie +='; path='+this.$path;
  if(this.$domain) cookie +='; domain='+this.$domain;
  if(this.$secure) cookie +='; secure='+this.$secure;

  this.$document.cookie=cookie;
}

Kaka.prototype.load = function() {
  var allcookies = this.$document.cookie;
  if(allcookies == "") return false;
	
  var start = allcookies.indexOf(this.$name + '=');
  if(start == -1) return false;
  start += this.$name.length+1;
  var end = allcookies.indexOf(';', start);
  if (end == -1) end = allcookies.length;
  var cookieval = allcookies.substring(start, end);
	
  var a = cookieval.split('&');
  for(var i=0;i<a.length;i++)
    a[i] = a[i].split(':');

  for(var i = 0;i<a.length; i++)
    this[a[i][0]] = unescape(a[i][1]);

  return true;
}

Kaka.prototype.remove = function() {
  var cookie = this.$name+'='; 
  if(this.$path) cookie += '; path='+this.$path;	
  if(this.$domain) cookie += '; domain='+this.$domain;
  cookie+='; expires=Fri, 02-Jan-1970 00:00:00 GMT';

  this.$document.cookie=cookie;
}

Som förslag till hur man kan använda klassen har vi fått följande av vår handledare...

Om klassen ovan skulle användas för att koda personinformationen skulle det så ut så här.

person = new Kaka(document, "person");
person["namn"]="kalle";
person["telefonnummer"]="12345";
person.store();
Vill vi istället hämta värdet från kakan skulle det se ut så här:

person = new Kaka(document, "person");
if(person.load())
alert("Hejsan "+person.name);

Och det är väl allt jag behöver veta antar jag...
Så jag gjorde en testsida för att kika lite på hur det kunde tänkas lösas. Detta är mitt förslag...

<html>
<head>
<title>Fredriks WebShop - Produktlista</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="../style.css" rel="stylesheet" type="text/css">

<!-- Här kommer javascriptet som lägger till varorna i cookiesen -->
<script language="JavaScript1.2" type="text/JavaScript1.2" src="kaka.js">
	function AddItem(obj)
	{
		var antal=obj.value;	
		
		varukorg["vara"]=antal;							//stopar in antalet på platsen med varunamnet
		varukorg.store();								//antar att denna sparar värdet i kakan
	}	
	
	varukorg = new Kaka(document, "varukorg", 12);					//skapar ny kaka
	varukorg.load();												//laddar in värden från gammal kaka
		
</script>
</head>

<body>

<p align="center"><font color="#0000FF" size="5">Produktlista</font></p>
<p align="center">Nedan visas en lista med alla produkter som g&aring;r att k&ouml;pa 
  i Fredriks Webbshop!</p>
<hr align="center" width="70%"></p>
<table width="704" border="0" align="center" cellpadding="2" cellspacing="2" bordercolor="#FFFFFF" bgcolor="#FFFFFF">
  <tr bgcolor="#CCCCCC"> 
    <td width="68" bgcolor="#999999"><font color="#000000">Produkt id</font></td>
    <td width="173" bgcolor="#999999"><font color="#000000">Vara</font></td>
    <td width="243" bgcolor="#999999"><font color="#000000">Beskrivning</font></td>
    <td width="64" bgcolor="#999999">Pris/st</td>
    <td width="62" bgcolor="#999999">Antal</td>
    <td width="56" bgcolor="#999999">K&ouml;p</td>
  </tr>
  <!-- här börjar formuläret som krävs för köp knappen och för antalfältet -->
  <form action="/users/fskfr02/kund/produkter.php" method="POST" name="kop">
<TR bgcolor=#FFFFFF><TD>3</TD>
			<TD>Apelsiner</TD>
			<TD>Gula runda frukter</TD>
			<TD>2.00</TD>			
			<TD><input name='antal0' type='text' size='4' maxlength='4' class='formFields'></TD>
			<TD><input name='kop0' type='submit' onclick='AddItem(document.kop.antal0);' value='K&ouml;p' class='formButtons'>
			</TR>
<TR bgcolor=#CCCCCC><TD>5</TD>
			<TD>Druvor (Blå)</TD>
			<TD>Söta druvor med druvsmak</TD>
			<TD>2.00</TD>			
			<TD><input name='antal1' type='text' size='4' maxlength='4' class='formFields'></TD>
			<TD><input name='kop1' type='submit' onclick='AddItem(document.kop.antal1);' value='K&ouml;p' class='formButtons'>
			</TR>
<TR bgcolor=#FFFFFF><TD>4</TD>
			<TD>Druvor (Gröna)</TD>
			<TD>Syrliga druvor med druvsmak</TD>
			<TD>1.00</TD>			
			<TD><input name='antal2' type='text' size='4' maxlength='4' class='formFields'></TD>
			<TD><input name='kop2' type='submit' onclick='AddItem(document.kop.antal2);' value='K&ouml;p' class='formButtons'>
			</TR>
<TR bgcolor=#CCCCCC><TD>6</TD>
			<TD>Kiwi</TD>
			<TD>Grön och luden. Mycket nyttig.</TD>
			<TD>2.00</TD>			
			<TD><input name='antal3' type='text' size='4' maxlength='4' class='formFields'></TD>
			<TD><input name='kop3' type='submit' onclick='AddItem(document.kop.antal3);' value='K&ouml;p' class='formButtons'>
			</TR>
<TR bgcolor=#FFFFFF><TD>2</TD>
			<TD>Äpplen</TD>
			<TD>Smakar som Äpplen</TD>
			<TD>1.00</TD>			
			<TD><input name='antal4' type='text' size='4' maxlength='4' class='formFields'></TD>
			<TD><input name='kop4' type='submit' onclick='AddItem(document.kop.antal4);' value='K&ouml;p' class='formButtons'>
			</TR>
  </form>
</table>
<p align="center">&nbsp;</p>
<hr width="70%">
<p align="center"><a href="index.htm">Meny</a> | <a href="kunduppgifter.php">Kunduppgifter</a> 
  | <a href="kassan.htm">Kassa</a></p>

</body>
</html>

Men serru detta fungerar inte. För det första så antar jag att det borde skapas en coockie med namnet varukorg direkt när sidan laddas. Så är inte fallet. Å andra sidan får jag inga felmeddelanden heller när jag klickar på någon av knapparna för att köpa en vara...

Vad gör jag för tokigt nu då???

OBS inlämning på Torsdag!!!!!!

:stud

solbulleMedlem sedan mars 20015 287 inlägg
#2

SKa inte deta se ut typ så här:

<script language="JavaScript1.2" type="text/JavaScript1.2" src="kaka.js">
<script language="JavaScript1.2" type="text/JavaScript1.2">
	function AddItem(obj)
	{
		var antal=obj.value;	
		
		varukorg["vara"]=antal;							//stopar in antalet på platsen med varunamnet
		varukorg.store();								//antar att denna sparar värdet i kakan
	}	
	
	varukorg = new Kaka(document, "varukorg", 12);					//skapar ny kaka
	varukorg.load();												//laddar in värden från gammal kaka
		
</script>
fredrikskMedlem sedan maj 2001211 inlägg
#3

Jo... testat det med men det fungerar inte heller...
Börjar misstänka att det är något fel på själva anropet till funktionen för nu får jag ett scriptfel på den raden när jag klickar på knappen.

Raden ser ut så här alltså:

<input name='kop0' type='submit' onclick='AddItem(document.kop.antal0);' value='K&ouml;p' class='formButtons'>

Där antal0 = namnet på det fält innehållande antalet som användaren har anget

och felmeddelandet är:
Object expected

Knepigt det här... *suck*
:l

(editerat anm)
Sorry för php koden.. .fixade till det lite..
Dock används inte namnet på knappen till något så det borde inte påverka.

Men tack iaf...=)

JojoxxMedlem sedan juni 20004 308 inlägg
#4

Jag tror du missat av Solbulle syftar på. Du kan inte inkludera script i samma script-block som du sedan lägger kod i, utan du får lägga det i varsitt script-block som Solbulle gjort. Annars kommer koden som ligger i script-blocket att ignoreras och funktionen AddItem() kommer aldrig att definieras.

<input name='kop$i' type='submit' onclick='AddItem(document.kop.antal0);' value='Köp' class='formButtons'>

Här har php-kod slunkit med ('kop$i'). Hänvisa gärna till den kod som verkligen kommer fram till webbläsaren. Annars händer det gärna att man försöker hitta fel som egentligen ligger i php-koden och alltså inte har med JavaScriptet att göra.

fredrikskMedlem sedan maj 2001211 inlägg
#5

Har kommit på en del grejer till som kanske kan vara till hjälp...

För det första... provade att skriva ut en alertruta i min funktion. Den körs aldrig...

Om jag däremot delar på scripten så här:

<script language="JavaScript1.2" type="text/JavaScript1.2" src="kaka.js">

	varukorg = new Kaka(document, "varukorg", 12);
	varukorg.load(); 
	
</script>

<script language="JavaScript1.2">

          function AddItem(obj)
          {
                  var antal=obj.value;
 	  alert(antal);
				  
                  varukorg["vara"]=antal; 
                  varukorg.store(); 
          }
		
</script>

så kommer alert rutan att skrivas ut. Då försvinner också felmeddelandet "Object expected" för anropsraden (se ovan)

Dock kommer den naturligtvis att klaga på att: "varukorg is not defined". Detta då varukorg inte deklareras i samma script...

Antar att det finns någon slags "global" historia för att få en variabel att bli tillgänglig över flera script?

Men det är en sak till jag inte blir klok på! Varför skapas det ingen kaka när sidan laddar? Borde det inte göra det när raden:

varukorg = new Kaka(document, "varukorg", 12);
varukorg.load();

Körs?

Man tycker ju det? Kan det finnas fler fel?

JojoxxMedlem sedan juni 20004 308 inlägg
#6

Kuriosa...

Dokumenttypen type="text/JavaScript1.2" känns lite avigt på samma sätt som du inte sätter med versionsnummer när du definierar en stilmall med elementet <style> (type="text/css2")

W3C

fredrikskMedlem sedan maj 2001211 inlägg
#7

Jojoxx skrev:

Kuriosa...

Dokumenttypen type="text/JavaScript1.2" känns lite avigt på samma sätt som du inte sätter med versionsnummer när du definierar en stilmall med elementet <style> (type="text/css2")

W3C

Jo.. men det borde ju inte påverka att kakan inte skapas?
Eller kan det göra det?
Vad borde det stå istället?

JojoxxMedlem sedan juni 20004 308 inlägg
#8

Åter igen. Du kan INTE lägga in script-kod i samma script-block som du använder för att inkludera script. Denna kod kommer att ignoreras, d.v.s. ditt objekt kommer aldrig att definieras.

Alltså, finns attributet src="something.js" med i <script>-elementet så kan du inte lägga in javascript-kod i detta block utan får skapa ett nytt.

JojoxxMedlem sedan juni 20004 308 inlägg
#9

Jo.. men det borde ju inte påverka att kakan inte skapas?

Nej, det var därför jag skrev "Kuriosa" (skönhets-grej). Medans jag skrev inlägget hade du dock svarat på det tidigare, så det hamnade i mitten.

fredrikskMedlem sedan maj 2001211 inlägg
#10

Men hur skall jag isf få med funktionerna i kaka.js + skapa en varukorg med:

new kaka(...)

och därefter

varukorg.load

Jag måste ju få tillgång till dessa funktioner för att kunna utföra dessa rader?

JojoxxMedlem sedan juni 20004 308 inlägg
#11

Titta på Solbulles exempel. Han har där delat upp det i 2 script-block.

JojoxxMedlem sedan juni 20004 308 inlägg
#12
varukorg["vara"]=antal;

Detta verkar inte heller helt rätt. I detta exempel borde du bara kunna lagra 1 vara i varukorgen vid namn "vara". "vara" borde alltså vara en variabel (parameter som skickas med till funktionen) med namn eller id på artikeln som skall läggas i korgen.

fredrikskMedlem sedan maj 2001211 inlägg
#13

Jojoxx skrev:

varukorg["vara"]=antal;

Detta verkar inte heller helt rätt. I detta exempel borde du bara kunna lagra 1 vara i varukorgen vid namn "vara". "vara" borde alltså vara en variabel (parameter som skickas med till funktionen) med namn eller id på artikeln som skall läggas i korgen.

Joru det är helt rätt... ville bara testa lite... vill först se en coockie ;-)

fredrikskMedlem sedan maj 2001211 inlägg
#14

Jo nu ser det ut så här:

<script language="JavaScript1.2" type="text/JavaScript1.2" src="kaka.js">
<script language="JavaScript1.2">

          function AddItem(obj)
          {
                  var antal=obj.value;
 				  alert(antal);
				  
                  varukorg["vara"]=antal; 
                  varukorg.store(); 
          }
		  
		  
	varukorg = new Kaka(document, "varukorg", 12);
	varukorg.load(); 
		
</script>

Men det fungerar inte heller... Det skapas fortfarande ingen coockie när sidan laddas...

Dessutom så ser koden väldigt lustig ut i dreamweaver... Den andra <script> koden färgas inte rätt... Verkar inte vara rätt att skriva så...

JojoxxMedlem sedan juni 20004 308 inlägg
#15

Sorry, såg att Solbulle slarvat lite och missat att </script> :)

<script language="JavaScript1.2" type="text/JavaScript1.2" src="kaka.js"></script>
<script language="JavaScript1.2" type="text/JavaScript1.2">
	function AddItem(obj)
	{
		var antal=obj.value;	
		
		varukorg["vara"]=antal;							//stopar in antalet på platsen med varunamnet
		varukorg.store();								//antar att denna sparar värdet i kakan
	}	
	
	varukorg = new Kaka(document, "varukorg", 12);					//skapar ny kaka
	varukorg.load();												//laddar in värden från gammal kaka
		
</script>
solbulleMedlem sedan mars 20015 287 inlägg
#16

Om inte annat kan du ju fimpa hela js-filen och lägga hela scriptet i "html-filen". Det blir lättare att felsöka då. (Med tanke på radhänvisningar)

fredrikskMedlem sedan maj 2001211 inlägg
#17

Joru... nu börjar det likna något!

nu ser det ut så här... så alla är med ;-)

<script language="JavaScript1.2" type="text/JavaScript1.2" src="kaka.js">
</script>

<script language="JavaScript1.2">

          function AddItem(obj)
          {
                  var antal=obj.value;
 				  alert(antal);
				  
                  varukorg["vara"]=antal; 
                  varukorg.store(); 
          }
		  
		  
	varukorg = new Kaka(document, "varukorg", 12);
	varukorg.load(); 
		
</script>

Och när jag klickar på knappen kommer alert rutan upp så nu är allt funkis....

Förutom att det fortfarande inte finns någon kaka då...

Vad skall den heta?
Borde den inte heta varukorg.txt eller nått?

JojoxxMedlem sedan juni 20004 308 inlägg
#18

Hur webbläsaren väljer att spara cookies på användarens dator har du ingen aning om, och det är inte meningen heller. Du läser bara från document.cookie och webbläsaren talar då om vad som finns där.

Bara ett litet exempel som visar vad som finns;

<a href="#" onClick="alert(document.cookie); return false;">Visa kakor</a>

Tillägg:

När jag kör din kod (fast jag bytt ut submit-knappen mot en button eftersom jag inte har de kringliggande php-filerna) så sätts kakan och går att läsa från document.cookie.

fredrikskMedlem sedan maj 2001211 inlägg
#19

joru!
Nu så!

Nu fungerar det... =)))

Tack så väldans mycket för all hjälp!

Kanske blir det inlämning på Torsdag iaf... =)

137 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)