[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Merkzettel ...
Seite 1 von 1

Merkzettel ...

Verfasst: 12. Mär 2007, 01:33
von Peter.Bickel
Hi,

ich hab einen Codeschnipsel, den ich früher schon mehrfach verwendet habe, um eine Art Merkzettel oder einen Mini-Warenkorb bei einer Website einzubauen. Dies waren allerdings Websites ohne Redaxo.

Eigentlich - so dachte ich - müste das auch innerhalb von Redaxo funktionieren, tut es aber nicht. Wisst Ihr, woran es hakt?

Ins Template ganz zu Beginn kommt:

Code: Alles auswählen

<?
$shoppingcart = array();
session_start();
session_register('shoppingcart');

if ($add != "") {
$shoppingcart[$add] = 1;
header("Location: $PHP_SELF".SID);
exit();
}
?>
Der Aufruf, um ein Produkt auf diesen Merkzettel zu setzen lautet dann:

Code: Alles auswählen

<a href="<?php echo $PHP_SELF.'&add=8'; ?>">Merken</a>
Das Auslesen des Arrays hatte ich dann so:

Code: Alles auswählen

<?php 
$anzahl=0;
foreach ($shoppingcart as $key=>$elem) {
 if ($elem==1) {
  $anzahl+=1;
 }
}
echo $anzahl;
?>
...

Allerdings klappt das nicht innerhalb von Redaxo, auch wenn ich $PHP_SELF gegen rex_getUrl ersetze. Das Array bleibt nach dem Klick auf den Link leer.

hat jemand einen Tipp, warum nicht?

Danke und schöne Grüße,
Peter.

Verfasst: 12. Mär 2007, 03:01
von alex2911

Code: Alles auswählen

if ($add != "") { 
funktioniert nur wenn register_globals auf on steht.
Ansonsten muss es

Code: Alles auswählen

if ($_GET['add'] != "") { 
lauten.
Schöner finde ich jedoch

Code: Alles auswählen

if ((int)$_GET['add'] != "0")
Davon abgesehen schau mal was bei $PHP_SELF rauskommt. Auch &add=8 bringt nicht viel da index.php&add=8 keinen Sinn ergibt.
index.php?add=8 ist schon was anderes. Jedoch auch hier fehlt article_id sodaß es besser wäre: rex_getUrl($article_id, "0")
Als 3. Parameter kannst Du bei rex_getUrl eine Array mit add=8 einsetzen.
Müsste etwa so aussehen:

Code: Alles auswählen

rex_getUrl($article_id, "0", array("add" => "8"))
soweit ich es noch im Kopf habe.


//Edit zu register_globals:
php.net hat geschrieben:Beispiel 29.1. Mit register_globals=on arbeiten

<?php
if ($username) { // kann vom User mit get/post/cookies übermittelt werden
$good_login = 1;
}

if ($good_login == 1) { // kann vom User mit get/post/cookies übermittelt werden
fpassthru ("/highly/sensitive/data/index.html");
}
?>

Beispiel 29.2. Mit register_globals = off arbeiten

<?php
if($_COOKIE['username']){
// kann nur von einem Cookie kommen
$good_login = 1;
fpassthru ("/highly/sensitive/data/index.html");
}
?>
Und hier noch Tipps zu session_start:
session_start (cookie-basierend) kann nur vor Ausgabe von html-Code gestartet werden.
Ich empfehle auch, sessions in der Datenbank zu speichern um das Einfügen von session_id's zu verhindern.
Quasi nach dem Motto:
Wenn eine SID in der URL oder im cookie gefunden wurde, schaue in der Datenbank nach und überprüf die Zeit des letzten Zugriffes. Wenn länger als 15 minuten oder nicht vorhanden, vergebe eine neue Session und verwerfe die aktuelle :)

Verfasst: 12. Mär 2007, 11:27
von Peter.Bickel
Hi Alex,

vielen Dank für Deine vielen Tipps.
Bin sie alle mal durchgegangen. Funktioniert aber trotzdem noch nicht.

1.
register_globals ist on. Hab trotzdem mal mit $_GET['add'] experimentiert, aber erfolglos.

2.
Das rex_getUrl hatte ich gestern auch noch eingesetzt ...

3.
session_start steht ganz zun Beginn als allererste Zeile im Template.



Stand der Dinge:

Ganz oben im Template:

Code: Alles auswählen

<?
$shoppingcart = array();
session_start();
session_register('shoppingcart');

if ((int)$_GET['add'] != "0") {
 $shoppingcart[] = $_GET['add'];
 $artid = rex_getUrl($article_id, 0, 0);
 header("Location: $artid");
 exit();
}
?>
Link zum Hinzufügen des Artikels:

Code: Alles auswählen

<a href="<? echo rex_getUrl($article_id, 0, array('add' => "8")); ?>">Bestellen</a>
Anzeige der Artikel im Korb:

Code: Alles auswählen

<?=count($shoppingcart)?>
Die Anzeige bleibt aber immer auf 0. Bin ratlos. Hast Du noch eine Idee?
Und vielen Dank für die Mühe, die Du Dir mit mir gemacht hast ...

Viele Grüße,
Peter.

Verfasst: 12. Mär 2007, 12:02
von Markus.Staab
Hi Peter,

statt $PHP_SELF versuche $_SERVER['PHP_SELF']

Gruß,
Markus

Verfasst: 12. Mär 2007, 12:08
von Peter.Bickel
Hi Markus,

danke, aber das hab ich auch schon versucht.
Mit

Code: Alles auswählen

header("Location: $_SERVER[PHP_SELF]");
gelange ich danach auf die Startseite, und das Array ist trotzdem noch leer.

Ich denke, dass

Code: Alles auswählen

 $artid = rex_getUrl($article_id, 0, 0);
 header("Location: $artid"); 
eigentlich schon der beste Weg sein müsste, oder?


Danke,
Peter.

Verfasst: 12. Mär 2007, 19:25
von alex2911

Code: Alles auswählen

<? 
$article_id = $this->getValue("article_id");
session_start(); 

if ((int)$_GET['add'] != "0") { 
 $_SESSION["shoppingcart"][] = (int)$_GET['add']; 
 $artid = rex_getUrl($article_id, 0); 
 header("Location: $artid"); 
 exit(); 
} 
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
?>

<a href="<? echo rex_getUrl($article_id, 0, array('add' => "8")); ?>">Bestellen</a>
Getestet und läuft :)

PS: Hier ne Demo:
http://www.jungwirth-media.at/55-0-testdel.html

Und hier der Code dazu:

Code: Alles auswählen

<? 
$article_id = $this->getValue("article_id");
session_start(); 
if ($_GET['sesdes'] == true){
 session_destroy();
 $artid = rex_getUrl($article_id, 0); 
 header("Location: $artid"); 
 exit(); 
}

if ((int)$_GET['add'] != "0") { 
 $_SESSION["shoppingcart"][] = (int)$_GET['add']; 
 $artid = rex_getUrl($article_id, 0); 
 header("Location: $artid"); 
 exit(); 
}
?>
<a href="<? echo rex_getUrl($article_id, 0, array('add' => rand(1,10))); ?>">Bestellen</a> | <a href="<? echo rex_getUrl($article_id, 0, array('sesdes' => "true")); ?>">Warenkorb leeren :)</a><br />

<?php 
if (sizeof($_SESSION["shoppingcart"]) != 0){
  echo '<pre>';
  print_r($_SESSION["shoppingcart"]);
  echo '</pre>';
}
?>

Verfasst: 12. Mär 2007, 20:12
von Peter.Bickel
Yeah! Vielen Dank.
Wünsch Dir was von mir ...

Lg,
Peter.

Verfasst: 12. Mär 2007, 20:20
von alex2911
pbickel hat geschrieben:Wünsch Dir was von mir ...
Ich wünsche mir den Weltfrieden :P

Verfasst: 12. Mär 2007, 20:23
von Peter.Bickel
Mach ich. kein Problem ... 8)

Verfasst: 10. Sep 2008, 08:47
von Richard.Laing
hallo

ich habe den post schon mal reingestellt, der ist wohl leider untergegangen... ;)

hier nochmal die fragen an die profis:

alter eintrag:

http://forum.redaxo.de/ftopic8358.html? ... merkzettel

in der demo

http://www.jungwirth-media.at/55-0-testdel.html

klappt es mit dem bestellen eines artikel (mehrfach) also 2 x den selben. bei meiner version die ich aus dem wiki habe kleider nicht.

alles geht ausser wenn ich einen artikel mehrfach haben möchte.
vielleicht wisst ihr ja rat für mich.
danke gruß richy

Verfasst: 10. Sep 2008, 08:58
von Peter.Bickel
Hallo Richy,

hast Du mal einen Link, wo man sic das Ganze bei Dir ansehen kann?

Peter.

Verfasst: 10. Sep 2008, 09:30
von Richard.Laing
ist auf dem weg per pn
gruß richy

EDIT Danke für die Schnelle hilfe.

LÖSUNG war: mein fehler ;)

Code: Alles auswählen

$id["menge"] ;
mußte noch mit in die ausgabe.

Verfasst: 27. Nov 2008, 23:45
von himmelreich
Hallo richy,

kannst du es ausführlich beschreiben?

Gruß
Himmelreich

Verfasst: 28. Nov 2008, 09:23
von Richard.Laing
hi himmelreich...
ich habe das ganze mal für einen pizzadienst gebaut, klappt auch ganz gut. ersetzt aber kein shopsystem.

der anfang

das hier in dein default template ganz nach oben damit der ganze klumpatsch erst mal in eine session geschrieben wird und du später drauf zugreifen kannst.

Code: Alles auswählen

<?php 
session_start(); // brauch natürlich nur einmal im template zu sein

$artid = rex_getUrl($this->getValue('article_id'), $REX['CUR_CLANG']); 
if ((int)$_REQUEST['add'] != "0") { $_SESSION["shoppingcart"][(int)$_REQUEST['add']]["menge"] += 1; 

$artid = rex_getUrl($this->getValue('article_id'), $REX['CUR_CLANG']); 

header("Location: http://". $_SERVER['HTTP_HOST'] ."/".$artid); exit(); } 
if ((int)$_REQUEST['remove'] != "0") { unset($_SESSION["shoppingcart"][(int)$_REQUEST['remove']]); 

$artid = rex_getUrl($this->getValue('article_id'), $REX['CUR_CLANG']); 

header("Location: http://". $_SERVER['HTTP_HOST'] ."/".$artid); exit(); 
} 
?>

einen artikel anlegen der *offline* bleibt. (nenn ihn merkzettel oder so)

block per modul minibeispiel php einpflegen:

hier zu bekommen http://www.redaxo.de/165-Moduldetails.html?module_id=9

Code: Alles auswählen

<?php if (sizeof($_SESSION["shoppingcart"]) != 0) {  
    echo '<h1 class="bestellen">Bisher auf dem Lieferschein:</h1>';  
    $db_korb = " SELECT * FROM rex_article_slice WHERE modultyp_id = '79'";  
    $prods = new rex_sql; $prods->setQuery($db_korb);      
    for ($i=0;$i<$prods->getRows();$i++) {     
    foreach ($_SESSION['shoppingcart'] as $pid => $id) {     
    if ($pid == $prods->getValue("id")) {  
    echo ' <div class="merkzettel"> ';  
    echo ' <h3 class="bestellen">'.$id["menge"].' x '.$prods->getValue("value1").' - '.$prods->getValue("value2").', a '.$prods->getValue("value4").' 
    <br><a href="'.rex_getUrl($prods->getValue("article_id")).'">  Mehr Information ...</span></a></h3>  <p><a  class="entfernen" href="'.rex_getUrl($this->getValue(article_id), $REX["CUR_CLANG"], array('remove'=>$prods->getValue("id"))).'"> Vom Lieferschein löschen</a></p></div> ';      
    $products_mail .= $id["menge"]." x "; $products_mail .= $prods->getValue("value1")." - ";    $products_mail .= $prods->getValue("value2")."\n";     
    $products_mail .= $prods->getValue("value3")." a "; $products_mail .= $prods->getValue("value4")."\n"; } }  
    $prods->next(); } ; } else { echo '<h1>Ihr Lieferschein ist leer</h1>'; }  
?>

im gleichen artikel (merkzettel) als zweiten block das hier:
achtung die 13 im form link bitte gegen die id des angelegten artikel tauschen.

Code: Alles auswählen

<?php if ($_GET[action] != "send") {?> 
<div class="bestell_form"> 
  <form name="form1" method="post" action="index.php?article_id=13&action=send"> 
    <label>Name:</label> 
    <input type="text" name="nachname" id="nachname"> 
    <label>Strasse:</label> 
    <input type="text" name="strasse" id="strasse"> 
    <label>PLZ:</label> 
    <input type="text" name="plz" id="plz"> 
    <label>Ort:</label> 
    <input type="text" name="ort" id="ort"> 
    <label>Telefon:</label> 
    <input type="text" name="telefon" id="telefon"> 
    <label>E-Mail:</label> 
    <input type="text" name="email" id="email"> 
    <input type="submit" name="send" id="send" value="send"> 
  </form> 
</div> 
<?php } ?> 
weiterverarbeiten als email versenden... dein job :)

im default template an der stelle wo der warenkorb erscheinen soll.
im link bitte das: .rex_getUrl(13,0). also die 13 ändern in die merkzettel artikel id

Code: Alles auswählen

<?php if (sizeof($_SESSION["shoppingcart"]) != 0){ echo ' <div id="order">  <p>'; echo (count($_SESSION["shoppingcart"])); if (count($_SESSION["shoppingcart"]) == 1) { echo ' Produkt'; } else { echo ' Produkte'; } echo '<br /> auf Ihrem Lieferschein.<br />  <a href="'.rex_getUrl(13,0).'">bestellen</a></p>  </div>'; } ?>
das bestellen modul mit dem du die zu bestellenden artikel anlegst

eingabe anpassen an die eigenen bedürfnisse:

Code: Alles auswählen

 
Gericht Nummer:<br /> 
<input type="text" size="80" name="VALUE[1]" value="REX_VALUE[1]" /><br />
Gericht Name:<br /> 
<input type="text" size="80" name="VALUE[2]" value="REX_VALUE[2]" /><br />
Gericht Beschreibung:<br /> 
<input type="text" size="80" name="VALUE[3]" value="REX_VALUE[3]" /><br />
Gericht Preis:<br /> 
<input type="text" size="80" name="VALUE[4]" value="REX_VALUE[4]" /><br />
ausgabe anpassen an die eigenen bedürfnisse:

Code: Alles auswählen

<div class="bestellung">
<span class="red">REX_VALUE[1] REX_VALUE[2]</span>
<span class="red">REX_VALUE[4]</span>
<div class="g_beschreibung">REX_VALUE[3]</div>
<?php echo ' <a class="bestellen2" href="'.rex_getUrl($this->getValue(article_id), $REX["CUR_CLANG"], array('add'=>REX_SLICE_ID)).'">bestellen</a>'; ?>
</div>
und nun beten und dann sollte alles klappen :)
ich hoffe das ich dir helfen konnte.

gruß richy

Verfasst: 28. Nov 2008, 09:36
von Peter.Bickel
Und als Ergänzung hier nochmal meine Beschreibung im Wiki:
http://wiki.redaxo.de/index.php?n=R3.Merkzettel

Verfasst: 28. Nov 2008, 09:41
von Richard.Laing
hi peter
wollte ich nicht unterschlagen, da schauen leider nicht immer alle user rein, da es unter redaxo 3 steht.
super sache die du da gebaut hast, für mal schnell einen kleinen shop zu bauen.
gruß richy

Verfasst: 28. Nov 2008, 09:47
von Peter.Bickel
Hi Richy,

schon klar, ich find's ja auch gut, dass Du es in s Forum geschfreiben hast. Ich dsachte nur, zwei Quellen sind besser als eine, weil es vielleicht jeder ein klein bisschen anders macht.
Und ich finde solche Sachen im WIKI oft leichter al im Forum.

Komisch nur, dass im Breadcrum R3 auftaucht. Denn ich habs eigentlich in die Kategorie 4 geschrieben, da kommt man auch über die Navigation hin:
http://wiki.redaxo.de/index.php?n=R4.Sonstiges

Schöne Grüße,
Peter.

Verfasst: 27. Feb 2009, 21:28
von mow
alex2911 hat geschrieben:PS: Hier ne Demo:
http://www.jungwirth-media.at/55-0-testdel.html
hallo alex2911
kannst du bitte die verschiedenen codeschnipsel dieser demo posten?
ich habe alle hinweise und ideen zum thema merkzettel durchgespielt. funktioniert soweit auch bestens.
ich möchte bei der menge +/-1 einsetzen und zwar wie in deinem beispiel so, dass bei 0 der artikel aus dem warenkorb entfernt wird (hab ich noch nicht ganz im griff). ev auch mit einer zusätzlichen möglichkeit den artikel direkt zu löschen (nicht über den 'umweg' der 0-menge). ebenso soll die möglichkeit 'ganzer warenkorb leeren' dazu kommen (hab ich im griff).
bei mir funktioniert das ganze noch nicht ganz so wie ich es will. aber bevor ich dir mit fragen deine zeit raube, würde ich es gerne selber nachvollziehen können, wo bei mir der fehler liegt.

danke dir.
lg mow

Verfasst: 4. Mär 2009, 00:52
von alex2911
hi

kein thema - mach ich noch im laufe der nacht.

lg alex


//edith

Schon da - es war nur als Template verpackt - dh. nur template anlegen, dem artikel (leer) hinzufügen - fertig.

Code: Alles auswählen

<? 
$buecherarray["1"] = "Schneewitchen und die 9 Riesen";
$buecherarray["2"] = "Die Wunder von Seehausen";
$buecherarray["3"] = "Der große Sauhaufen";

$article_id = $this->getValue("article_id");
session_start(); 
if ($_GET['sesdes'] == true){
 session_destroy();
 $artid = rex_getUrl($article_id, 0); 
 header("Location: $artid"); 
 exit(); 
}

if ((int)$_GET['add'] != "0") { 
 $_SESSION["shoppingcart"][(int)$_GET['add']]["menge"] += 1;
 $artid = rex_getUrl($article_id, 0); 
 header("Location: $artid"); 
 exit(); 
}
if ((int)$_GET['remove'] != "0") { 
if ($_SESSION["shoppingcart"][(int)$_GET['remove']]["menge"] > 1){
 $_SESSION["shoppingcart"][(int)$_GET['remove']]["menge"] -= 1;
} else {
unset($_SESSION["shoppingcart"][(int)$_GET['remove']]);
}
 $artid = rex_getUrl($article_id, 0); 
 header("Location: $artid"); 
 exit(); 
}
?>
<a href="<? echo rex_getUrl($article_id, 0, array('sesdes' => "true")); ?>">Warenkorb leeren :)</a><br /><br />

<?php 
if (sizeof($_SESSION["shoppingcart"]) != 0){
  foreach ($_SESSION['shoppingcart'] as $shopid => $id){
    echo "Buch Titel: " . $buecherarray[$shopid] . " | ID: " . $shopid . ' | Menge: ' . $id["menge"] . '  |  <a href="' . rex_getUrl($article_id, 0, array('remove' => $shopid)) . '">Menge -1</a><br />';
  }
}
?>
<br /><br /><b>Willkommen im Büchershop des Beispielhauses Schlumpfhausen ;)<br />Bitte suchen Sie Sich ein Buch aus: </b><br /><br />
<div style="float:left; width:200px; min-width:200px; text-align:center; "><a href="<? echo rex_getUrl($article_id, 0, array('add' => "1")); ?>"><img src="http://noefv.at/newsbilder/rotekarte2_sml_100.jpg" border="0"></a></div>
<div style="float:left; width:200px; min-width:200px; text-align:center; "><a href="<? echo rex_getUrl($article_id, 0, array('add' => "2")); ?>"><img src="http://noefv.at/newsbilder/logogruppensitzung_sml_100.jpg" border="0"></a></div>
<div style="float:left; width:200px; min-width:200px; text-align:center; "><a href="<? echo rex_getUrl($article_id, 0, array('add' => "3")); ?>"><img src="http://noefv.at/newsbilder/finanzsteuerfibel_sml_100.jpg" border="0"></a></div>

Verfasst: 4. Mär 2009, 15:20
von mow
hallo alex
danke, damit werde ich meinen fehler sicher bereinigen können.
gruss
mow