Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 11:51 Der er 19 kommentarer og
1 løsning

Sende mail med dynamisk indhold

Hej,

jeg har en shop, som jeg er igang med at udbygge. Det nye er, at der kan foretages konfigureration af de enkelte varer. Disse konfigurationer ligger i en anden tabel end selve varekurven.

Når en ordre afgives, modtager jeg automatisk en mail, men jeg kan ikke finde ud af at få disse ekstra linier med (konfigurationerne).

Håber der er nogle af jer, der kan give mig et tip til hvordan dette klares...
Avatar billede webcreator Nybegynder
12. juli 2005 - 11:53 #1
Brug funktionen mail().
http://dk2.php.net/manual/en/ref.mail.php

Deri kan du jo angive variabel tekst med variabler :)
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 12:18 #2
Jow jow - men det er ikke det der er problemet :-) Jeg modtager jo allerede idag en mail, når der er afgivet nye ordrer. Problemet består i at få de ekstra/nye konfigurationer ind i mailen, så de kommer sammen med den vare, de hører til.

Antal - Vare - Pris - Pris i alt
1 - Computer - 5.995,00 - 5.995,00
1 - 256 MB RAM - 295,00 - 295,00 <- dette er den ekstra linie
Vareværdi i alt.... bla bla bla
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 12:18 #3
Skal du eventuelt se noget kode?
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 12:25 #4
Jeg plejer at lave en eller andet form for syntaks for hvilke værdier der skal indsættes i teksten, og derefter sende teksten igennem en (mere eller mindre langhåret) søg-og-erstat funktion. Et mere statisk system kan nøjes med at hardcode en tekst med indsatte variable. F.eks. (pseudo kode)

///

mail = 'Hej kunde, dette er din ordre';

ordre = hent_ordre();
konfiguration = hent_konfiguration(ordre);

mail .= konfiguration;

if(konfiguration) {
    mail .= konfiguration;
}

send_mail(mail);

///

Til sidst har jeg en variabel der indeholder en email præcist som den skal se ud.

Derefter kan du enten maile direkte med mail() funktionen, eller bruge en SMTP klient. PEAR har nogle ganske ok klasser.
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 12:31 #5
Bortset fra at du benytter dig af funktioner, så minder tankegangen vist lidt om mit:

///
Sætter diverse variabler øverst

        // Definerer selve bestillingen - varekurven
        include("admin/connect.php");
        $bestilling = "$shoptekster[antal]\t\t$shoptekster[varetekst]\t\t$shoptekster[pris_stk]\t$shoptekster[pris_i_alt]\n";
        $kurvensindhold = mysql_query("SELECT * FROM ordrelinier_samlet WHERE ordrenr = '$alinfo[ordrenr]'");
        while($kurv = mysql_fetch_array($kurvensindhold)) {
            $pris_total = $kurv[antal]*$kurv[pris];
            // Henter varenavn
            $q_varenavn = mysql_query("SELECT varenavn FROM varer_flex WHERE vareid = '$kurv[vareid]' AND sprogid = '$sprog'");
            $varenavn = mysql_fetch_assoc($q_varenavn);
            $bestilling= $bestilling.$kurv['antal']."\t\t".$varenavn['varenavn']."\t\t".number_format($kurv['pris'], 2, ',','.')."\t".number_format($pris_total, 2, ',','.')."\n";
            if($_SESSION[konfigurator] == '1') {
                // Henter eventuelle konfigurationer
                $q_konfemner = mysql_query("SELECT * FROM varekurv_konf INNER JOIN konfiguratoremner ON varekurv_konf.emneid = konfiguratoremner.konfemne_id WHERE varekurv_konf.id_varekurv = '$kurv[id_varekurv]'");
                while($konfemner = mysql_fetch_assoc($q_konfemner)) {
                    $bestilling= $bestilling.$konfemner[antal]."\t\t".$konfemner[emnenavn]."\t\t".number_format($konfemner['pris'], 2, ',','.')."\t".number_format(($konfemner[pris]*$konfemner[antal]), 2, ',','.')."\n";
                }
            }
        }
        mysql_close($connection);

// Sender mail
mail(....
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 12:47 #6
Så problemet er at du vil have flettet konfigurationerne ind mellem de tilhørerne ordrer?

Den nemmeste løsning til det jeg lige kan finde frem fra baghovedet er noget med at opbygge to arrays: (pseudo igen)

///

ordrer[] = hentordrer();
konfigurationer[] = hent_konfigurationer();

mail = 'Hej kunde! se her, hvorfor du nu er fattig';

foreach(ordrer as ordre) {
    mail .= ordre;
    if(konfigurationer[ordre['id']]) {
        mail .= konfigurationer[ordre['id']];
    }
}

mail .= 'MVH Butikken';

///

Noget i den stil?
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 13:22 #7
Cool nok. Jeg har tit prøvet at få det der med arrays og foreach til at spille, og har altid givet op. Det er altså bare noget, som jeg har svært ved at fatte - talt lige ud af posen :-)

Kan du uddybe det lidt mere?

hentordrer() og hent_konfigurationer() er begge almindelige udtræk af databasen, som er defineret i en funktion højere oppe i koden, ikke?
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 14:01 #8
Det bliver lidt et skud fra hoften. Jeg har bare genbrugt din egen kode :)

Du kan se det her: http://pastebin.com/311814

Det er ikke testet, så jeg kan ikke love noget
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 14:07 #9
Jeg har lige prøvet at smide det ind, og det giver følgende resultat:

Antal        Varetekst        Pris pr. stk.    Pris i alt
1.00        Array        995,00    995,00
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 14:09 #10
Smider lige et dump af mine to tabeller - ved ikke om det hjælper dig, men det ville i hvert fald hjælpe mig :-)

CREATE TABLE `varekurv` (
  `id` int(11) NOT NULL auto_increment,
  `sessionid` varchar(32) NOT NULL default '',
  `vareid` varchar(20) NOT NULL default '0',
  `antal` decimal(5,2) NOT NULL default '0.00',
  `pris` decimal(8,2) NOT NULL default '0.00',
  `dato` date NOT NULL default '0000-00-00',
  `betalingsform` int(2) NOT NULL default '0',
  `fragt` decimal(5,2) NOT NULL default '0.00',
  `forsendelse` int(2) NOT NULL default '0',
  `ordrenr` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=93 ;

CREATE TABLE `varekurv_konf` (
  `id_konfkurv` int(11) NOT NULL auto_increment,
  `id_varekurv` int(11) NOT NULL default '0',
  `konfgruppeid` int(11) NOT NULL default '0',
  `emneid` int(11) NOT NULL default '0',
  `antal` decimal(5,2) NOT NULL default '0.00',
  `pris` decimal(5,2) NOT NULL default '0.00',
  `sessionid` varchar(32) NOT NULL default '',
  `ordrenr` int(8) NOT NULL default '0',
  PRIMARY KEY  (`id_konfkurv`)
) TYPE=MyISAM AUTO_INCREMENT=43 ;
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 14:13 #11
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 14:13 #12
Nu virker det "næsten" - bortset fra at den skriver Array i stedet for produktnavnet... Det kan jeg ikke helt få væk :-(

Antal        Varetekst        Pris pr. stk.    Pris i alt
1.00        Array        995,00    995,00
1.00        Array        995,00    995,00
1.00        ewer        123,00    123,00
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 14:14 #13
Hmm nej nu er jeg ikke sikker....hvad med en beskrivelse af ordrelinier_samlet ?
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 14:14 #14
Ah sorry 2 sec
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 14:15 #15
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 14:17 #16
Antal        Varetekst        Pris pr. stk.    Pris i alt
1.00        NY Testvare        995,00    995,00
1.00        NY Testvare        995,00    995,00
1.00        ewer        123,00    123,00

DET ER FANDEME BARE I ORDEN!!!

Det havde jeg aldrig klaret alene. Smid et svar, og så får du dine velfortjente point :-)

Kan du eventuelt ganske kort forklare hvordan du får foreach og dine arrays til at virke?
Avatar billede wuggawugga Nybegynder
12. juli 2005 - 14:28 #17
Jeg kan da prøve

Hvis du har to eller flere arrays der skal lege med hinanden arrays, er humlen egentlig bare at bruge de samme værdier som nøgler. Ligesom i databasen når en tabel refererer til en anden.

$array1 = array(1, 2, 3);
$array2 = array(1 => 'abc', 2 => 'def', 3 => 'ghi');

foreach($array1 as $a) {    // Denne løkke vil give $a = 1, 2 eller 3 i hver deres iteration
    print($array2[$a]);    // Dvs. her står egentlig $array2[1], $array2[2] eller $array[3];
}

Det er bare et spørgsmål om at opbygge det ene array så det indeholder nøgler til det andet array.
Prøv at lege lidt med det - sammen med en hulens masse echo() kald ;)
Avatar billede steenolsen1 Nybegynder
12. juli 2005 - 14:33 #18
Tak for det - giver lidt mere klarhed, men det er jo som bekendt ikke meget der skal til, før skidtet ikke virker... :-)

Jeg prøver mig frem!
Avatar billede steenolsen1 Nybegynder
19. juli 2005 - 18:38 #19
Wuggawugga - jeg har brug for din hjælp endnu engang.... Point kan jeg tildele i et andet spørgsmål, men jeg går ud fra at du abonnerer på dette spm.....?

Systemet til registrering af de valgte konfigurationer skal udvides - mailen, som du hjalp mig med forbliver uændret.

DET NYE ER:
Nogle konfigurationsgrupper SKAL udfyldes, andre ikke. Derudover skal der på nogle af dem angives antal, på andre ikke. Det er formodentlig noget med nogle arrays man skal have fat i, men jeg kan vitterligt bare ikke forstå det - trods din forklaring. Har snart brugt to dage på det... Kan du hjælpen? Poster min kode nedenfor:
Avatar billede steenolsen1 Nybegynder
19. juli 2005 - 18:38 #20
Siden der postes til:

<?
session_start();
if(isset($PHPSESSID)) {
    // Tjekker om kriterier er opfyldt - definerer de forskellige muligheder.
    if(isset($_POST['bestil_vare']) AND ($_POST['antal'] > '0')) {
        // Tjekker om der er konfigurator
        if($_SESSION[konfigurator] == '1') {
            // Tjekker hvilke konfiguratorgrupper, der hænger sammen med varen - om der overhovedet er nogle.
            include("admin/connect.php");
            $q_konftjek = mysql_query("SELECT * FROM konf_vis_siden INNER JOIN konfiguratorgrupper ON konf_vis_siden.id_kge = konfiguratorgrupper.konf_id WHERE konf_vis_siden.vareid = '$_POST[vareid]' AND konfiguratorgrupper.aktiv = '1' AND sprog = '$_POST[sprog]'");
            $kt_rows = mysql_num_rows($q_konftjek);
            if($kt_rows > '0') {
                while($konftjek = mysql_fetch_assoc($q_konftjek)) {
                    // Tjekker om de eventuelle obligatoriske felter er sat.
                    if($konftjek[obligatorisk] == '1') {
                        // Tjekker om der skal indtastes et antal, for at registrere konfemnet eller ej.
                        if(($konftjek[antal_yn] == '1') AND ($_POST[konf_antal_.$konftjek[id_kge]] == '')) {
                            header("Location: $_SERVER[HTTP_REFERER]&ikurv=0");
                        } else {
                            header("Location: $_SERVER[HTTP_REFERER]&ikurv=1");
                            $_SESSION[insert] = 1; // Sat
                        }
                    }
                    // Hvis ikke obligatorisk || Tjekker om der skal indtastes et antal for at registrere emnet eller ej
                    if(($konftjek[antal_yn] == '1') AND ($_POST[konf_antal_.$konftjek[id_kge]] == '')) {
                        header("Location: $_SERVER[HTTP_REFERER]&ikurv=0");
                    } else {
                        header("Location: $_SERVER[HTTP_REFERER]&ikurv=1");
                        $_SESSION[insert] = 1; // Sat
                    }
                }
            }
        }
        // Hvis ingen konfigurator - kun krav til antal, som er tjekket i toppen
        else {
            header("Location: $_SERVER[HTTP_REFERER]&ikurv=1");
            $_SESSION[insert] = 1;
        }
    }

    // Hvis kriterierne overfor at overholdt, og $insert = 1 så:
    if($_SESSION[insert] == 1) {
        // Forbindelse til db etableres
        include("admin/connect.php");
        $fantal = str_replace(',','.',$_POST[antal]);
        $fpris = str_replace(',','.',$_POST[pris]);
        $ffragt = str_replace(',','.',$_POST[fragt]);
        // REGISTRERER VAREN I KURV
        mysql_query("INSERT INTO varekurv (sessionid,vareid,antal,pris,dato,fragt) VALUES ('$PHPSESSID', '$_POST[vareid]', '$fantal', '$fpris', NOW(), '$ffragt')");
               
        // Henter mulige konfigurationsgrupper, og tjekker om de er sat
        if($_SESSION[konfigurator] == '1') {
            $q_tjek = mysql_query("SELECT * FROM konf_vis_siden WHERE vareid = '$_POST[vareid]'");
            $antal_raekker = mysql_num_rows($q_tjek);
            if($antal_raekker > '0') {
                // Henter id'et i varekurven, så det kan registreres i varekurv_konf
                $q_kurv_id = mysql_query("SELECT * FROM varekurv WHERE sessionid = '$PHPSESSID' AND vareid = '$_POST[vareid]' ORDER BY id DESC LIMIT 1");
                $kurv_id = mysql_fetch_assoc($q_kurv_id);
                while($tjek = mysql_fetch_assoc($q_tjek)) {
                    // Tjekker om der er registreret indhold til den enkelte konfgruppe
                    if(($_POST[$tjek[id_kge]] <> '') AND ($_POST[antal] > '0')) {
                        $konf_id = $tjek[id_kge];
                        list($emneid, $pris) = split('[/.-]', $_POST[$tjek[id_kge]]);
                        $fpris = str_replace(',','.',$pris);
                        $emneantal2 = $_POST[konf_antal_.$tjek[id_kge]];
                        $emneantal = str_replace(',','.',$emneantal2);
                        mysql_query("INSERT INTO varekurv_konf (id_varekurv,konfgruppeid,emneid,antal,pris,sessionid) VALUES ('$kurv_id[id]', '$konf_id', '$emneid', '$emneantal', '$fpris', '$PHPSESSID')");
                    }
                }
            }
        }
        unset($_SESSION[insert]);
      } else {
        header("Location: $_SERVER[HTTP_REFERER]&ikurv=0");
    }
} else {
    header("Location: index.php");
}
?>
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