Avatar billede c9steen Nybegynder
13. februar 2001 - 16:11 Der er 9 kommentarer og
2 løsninger

Komprimering af tekst til cookie

Jeg har brug for en rutine der kan komprimere alm. ell. escape\'et tekst så det ikke fylder så meget. Teksten anvendes til at gemme informationer om varekøb i cookie i forbindelse med varekurvsfunktion og data må derfor ikke gå tabt.

Komprimeringen skal kunne håndtere æ, ø og å, hvorfor teksten for nuværende gemmes i escape format og de enkelte varepunkter separeret med komma.

Komprimeringsgrad størst mulig men jeg stiler efter ca. 50% afkortning i tekstlængde...

Anvendelse i NN4.03+ samt IE 4.01+
Avatar billede c9steen Nybegynder
13. februar 2001 - 16:12 #1
Der skal selvfølgelig også kunne dekomprimeres.. :-)
Avatar billede jakoba Nybegynder
13. februar 2001 - 17:14 #2
En decideret kompresseions algoritme ville blive Meget tung i javascript, så jeg vil anbefale at du snarere konventerere dig om andre former for komprimering, såsom faste formater, brug af varenumere istedet for varebeskrivelser, etc.

Det skulle ikke undre mig om du kan spare 75% bare på det.

Du har 4K plads i en cookie, jeg har svært ved at forestille mig en bruger der vil afgive en så lang ordre i een session.

mvh JakobA
Avatar billede c9steen Nybegynder
13. februar 2001 - 19:19 #3
Med den version af min varekurv, som jeg har for nuværende, vil det svare til et sted mellem 20 og 30 varelinier. Vel ikke så tit det sker men ikke umuligt...

Varelinier skal være brugerdefinerede og jeg kan derfor ikke vide, hvad der faktisk kommer til at stå.

Et evt. alternativ kunne være asp - men det vil ikke være oplagt, da det ikke kan implementeres på standard domain\'s
Avatar billede jakoba Nybegynder
13. februar 2001 - 23:24 #4
Har du kurven på nettet et sted så man kan kikke?
Avatar billede c9steen Nybegynder
14. februar 2001 - 07:39 #5
Avatar billede jakoba Nybegynder
14. februar 2001 - 23:21 #6
Her er et udkast til hvordan varekurven kan modificeres så der ikke bruges så meget cookie-plads.
På den beskrevne måde vil hver bestillingslinie fylde 7 til 10 tegn i cookien.

Det kræver at brugeren opretter sit varesortiment som beskrevet herunder:

Sig til hvis noget er for uklart eller ubrugeligt :)

der oprettes en ny fil \"sortiment.js\" hvor brugeren indtaster de varer der skal sælges fra siden.
//
// Her skriver du dit varesortiment.
// Du kan godt angive et større udvalg af varer end du giver mulighed for
// at bestille på siderne.
// Alle varer der kan bestilles skal være beskrevet her.
//
// For hver vare angives:
// varenummer:  1000 til 9999
// beskrivelse:  et navn der entydigt beskriver varen
// pris:        varens pris.
//
// der skal også oprettes en vare beskrivelse for.
// specialtinbud såsom \"køb 2 søer og få en gratis pattegris\"
// og kvantumsrabatter \"køb 10 orner for 9 orners pris\"
//
        // funktion opretVare() og andre funktioner på denne side bør defineres
        // i varekurv.js eller en anden .js fil der hentes FØR denne.
        //
function opretVare ( varenummer, beskrivelse, pris ) {
  vListe[vListe.length] = new Vare( varenummer, beskrivelse, pris );
}; //end opretVare ( integer, string, beloeb )

function Vare ( varenummer, beskrivelse, pris ) {
  this.varenr = varenummer;
  this.beskr  = beskrivelse;
  this.prisen = pris;
  return this;
}; //end Vare ( integer, string, beloeb ) -> Vare objekt

var vListe = new Array();  // defineres ligesom adderVare i anden fil.

//
// Hver vare beskrivelse skrives i en linie som i eksemplet nedenfor.
// Husk at der skal citationstegn om beskrivelsen.
// Og at prisen skrives i International form, dvs med punktum istedet
// for komma foran ørebeløbet.

opretVare( 1000, \'Nuttede pattegrise\',  299.95 );
opretVare( 1010, \'Små babygrise\',      399.45 );
opretVare( 1020, \'Tumlende kravlegrise\',499.25 );

opretVare( 2000, \'Jomfru hungrise\',    1299.00 );
opretVare( 2010, \'Drægtige hungrise\',  1399 );
opretVare( 2020, \'Aflagte hungrise\',  1499 );

opretVare( 3000, \'Ubrugte hangrise\',  1299 );
opretVare( 3010, \'Fuldt oplagte hangrise\',1825 );
opretVare( 3020, \'Gamle særegne hangrise\',49.75 );


function testVare( varenr ) {
  for (var i=0; i<vListe.length && varenr!=vliste[i].varenr; i++)
  return  ( i<vListe.length ) ? vliste[i] : null;
}; //end testVare( Integer ) -> Vare objekt / null


function testBeskPris( beskrivelse, pris ) {
  for (var i=0; i<vListe.length && beskrivelse!=vliste[i].beskr; i++)
  return  ( i<vListe.length && pris==vliste[i].pris ) ? vliste[i].varenr : 0;
}; //end testBeskPris( string, beloeb ) -> varenr / 0


function putiKurv ( varenr, antal ) {
  if ( putiKurv.arguments.length == 1 ) antal = 1;
  if ( testVare( varenr ) ) {
    // adder \"&nnnn_nn\" til cookie, enten som nyt varenr eller adderet til gammelt.
    var liste = getCookie(\"vK???\")
    liste = liste.split(\"&\");
    for (var i=0; i<liste.length; i++)
      if ( list[i].substring(0,4) == varenr ) break;
    if ( i == liste.length ) {
      //  adder een til antal linier
      setCookie(\"vkLinier\", parseInt( getCookie( \'vkLinier\'))+1);
    } else {
      var temp = liste[i].split(\"_\");
      antal = antal +temp[1];
    };
    liste[i] = \"\"+varenr+\"_\"+antal
    liste = liste.join(\"&\");
    setCookie(\"vK???\", liste);
  } else {
    debug ( \"Det angivne varenummer findes ikke\" );
  };
}; //end putiKurv ( Integer, Integer )


function fjernfraKurv ( varenr, antal ) {
  if ( putiKurv.arguments.length == 1 ) antal = 1;
  if ( testVare( varenr ) ) {
    // fjern \"&nnnn_nn\" fra cookie.
    var liste = getCookie(\"vkKurv\")
    liste = liste.split(\"&\");
    for (var i=0; i<liste.length; i++)
      if ( list[i].substring(0,4) == varenr ) break;
    if ( i == liste.length ) {
      // fejl, der er ikke noget at fjerne
    } else {
      var temp = liste[i].split(\"_\");
      antal = temp[1] -antal;
      if ( antal > 0 ) {
        liste[i] = \"\"+varenr+\"_\"+antal
      } else {
        for (var j=i+1; j<liste.length; j++) liste[j-1]=liste[j];
        liste.length = liste.length -1;
        //  træk een fra antal linier
        setCookie(\"vkLinier\", parseInt( getCookie( \'vkLinier\'))-1);
      }
    };
    liste = liste.join(\"&\");
    setCookie(\"vkKurv\", liste);
  } else {
    debug ( \"Det angivne varenummer findes ikke\" );
  };
}; //end fjernfraKurv ( Integer, Integer )


// nedenstående funktioner erstatter de tilsvarende i varekurv.js



function justerVare( beskrivelse, pris, antal )
  var varenr = testBeskPris( beskrivelse, pris );
  if ( antal == 0 ) return;
  if ( varenr > 0 ) {
    if ( antal>0 ) putiKurv( varenr, antal )
    else      fjernfraKurv( varenr, antal );
  } else {
    debug ( \"Det er ingen vare med den beskrivelse og pris\" );
  };
}; //end justerVare( string, beloeb, integer )


function tilskrivVare(\'Tumlende kravlegrise\',499.25)
  var varenr = testBeskPris( beskrivelse, pris );
  if ( varenr > 0 ) {
    putiKurv( varenr, 1 );
  } else {
    debug ( \"Det er ingen vare med den beskrivelse og pris\" );
  };
}; //end tilskrivVare( string, beloeb )


function fraskrivVare(\'Tumlende kravlegrise\',499.25)
  var varenr = testBeskPris( beskrivelse, pris );
  if ( varenr > 0 ) {
    fjernfraKurv( varenr, 1 );
  } else {
    debug ( \"Det er ingen vare med den beskrivelse og pris\" );
  };
}; //end tilskrivVare( string, beloeb )


// funktionen udskrivKurv er kun antydet for det er en grumme komplex en
// at sætte sig ind i :-))
//
function udskrivKurv ( ???? ) {

  var liste = getCookie(\"vkKurv\");
  liste = liste.split(\"&\");
  liste.sort();
  for (var i=0; i<liste.length; i++) {
    var tmp = liste[i].split(\"_\");
    // tmp[0] == varenummer
    // tmp[1] == antal bestilte
    var vr = testVare( tmp[0] );
    // vr.varenr == varenr
    // vr.beskr == beskrivelse
    // vr.pris  == pris per styk
    // det skulle være hvad du bruger for at skrive den varelinie.

  };

}; //end udskrivKurv ( ???? )
   
Avatar billede c9steen Nybegynder
15. februar 2001 - 08:38 #7
Ideen med den fremlagte varekurv er, at den skal være tilgængelig også for lægmand - eller næsten :-)

Ved at oprette en ekstra fil, hvori varesortimentet er angivet, skal der - egentlig - gøres dobbelt arbejde, idet intensionerne med varekurven ikke længere er opfyldt. I den nuværende udformning af varekurven, skal hver vare kun oprettes og håndteres netop det ene sted (de steder), hvor den bliver præsenteret og det letter opsætningen en hel del.
Samtidig bliver varelinien først oprettet i varekurven i det øjeblik den bliver brugt og hvis den fjernes frigives varelinien til en anden vare. Der går altså ikke - urimeligt - meget hukommelse til spilde til information, som ikke måtte være nødvendig.

Din ide giver mere plads i kurven - Ok - men den giver ikke komprimering af cookieteksten.

Hvordan vil din model håndtere 500-1000 varenumre? Så vidt jeg kan se oprettes der ved hver indlæsning et object-array med samtlige varer. Kan browseren håndtere så mange informationer? Hvor lang tid går der med konverteringen?
Avatar billede jakoba Nybegynder
15. februar 2001 - 11:28 #8
Ja jeg er også selv lidt loren ved den der \"varesortiment\" fil.
Men har også lidt basis for at kalde den en feature istedet for en fejl.
1) en sådan varesortiment fil gør det muligt at bruge varenumrene istedet for at skulle stave beskrivelsen helt rigtigt og ens hver gang
2) sortimentsliten kan bruges til at \"autogenerere\" indkøbslinks i en senere udvidelse.
3) alle seriøse butikker bruger varenumre. Blot en beskrivelse er alt for risikabelt og svært at slå op.

Nej, der bliver kun lagt noget i cookien når der er en bestilling på det varenr (se i fjernfraKurv hvor entry slettes hvis der er <= 0 varer bestilt.
Så varekurven ville kunne supportere een enkelt ordre med 300-350 bestilte forskellige varer, uanset hvor stort sortimentet er. ( Men arrayet kan som du påpeger gå hen og blive et problem, 10.000 array elementer fylder i sig selv en hel del. :-)) (hørte et sted 64K max. men Comp RAM skal også tages i ed)

Og dertil kommer at mit forslag snor sig frem og tilbage på kryds og tværs af de interfaces du allerede har. Det ville nok være bedre med en komprimer routine fra kurv[] til cookie og tilbage.

mvh JakobA
Avatar billede c9steen Nybegynder
15. februar 2001 - 12:11 #9
Jep :-) sortimentlisten er oplagt en feature og jeg vil tro, at den - alt til trods - kan håndtere større varemængder end den eksisterende løsning.

Hvorom alting... så har du måske set, at jeg ikke anbefaler modellen med cookies ved større salgssteder?

Jeg er med på, at cookieteksten i din model fylder meget mindre og at der ikke fyldes på, før der er vare(r).

Varekurven sorterer efter tekst i stigende orden og supporterer derfor allerede varenumre - de skal blot angives, som en del af teksten: \'100234-34 - Halvnøgne grise\'.

Din ide er ikke ubrugelig men heller hvad jeg søgte så jeg lader spørgsmålet stå åbent indtil videre. Du skal nok få point som følge af det gode initiv :-)

/Steen
Avatar billede jakoba Nybegynder
15. februar 2001 - 12:40 #10
fair enuft :-))

Og tak for en god varekurv, din er vist den eneste danske freeware kurv vi har.

mvh JakobA
Avatar billede c9steen Nybegynder
17. marts 2001 - 12:36 #11
Jeg lukker af for spørgsmålet. Er der noegn som kommer med et brugbart svar, er der stadig point til en ny oprettelse

/Steen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester