Bitte um Hilfe: Versuch, einen Warenkorb zu integrieren

Gesperrt
tommo
Beiträge: 120
Registriert: So 27. Jun 2004, 21:34
Kontaktdaten:

Bitte um Hilfe: Versuch, einen Warenkorb zu integrieren

Beitrag von tommo »

Hallo zusammen,

ich habe einen einfachen Warenkorb gefunden, den man sicher leicht in Contenido integrieren kann.

Es handelt sich dabei um den freien Warenkorb: Webforce Cart (www.webforcecart.com). Dieser Warenkorb besteht eigentlich nur aus zwei Dateien, eine für die Ausgabe und eine für die Verarbeitung.

Hier der Code für die Ausgabe, den man als Modul anlegen kann:

Code: Alles auswählen

<?php
// wfCart Demo

// You must included wfcart.php BEFORE you start the session. 
include "wfcart.php";
session_start();      // start the session


$cart =& $_SESSION['wfcart']; // point $cart to session cart.
if(!is_object($cart)) $cart = new wfCart(); // if $cart ( $_SESSION['cart'] ) isn't an object, make a new cart

// end of header stuff

?>

<h3>wfCart Demo</h3>
 
<?php

// Usually you would get your products from a database but we'll pretend.. 

$products = array();
$products[1] = array("id"=>1,"name"=>"A Bar of Soap","price"=>2.00);
$products[2] = array("id"=>2,"name"=>"Shampoo","price"=>4.80);
$products[3] = array("id"=>3,"name"=>"Pizza","price"=>12.95);


// check to see if any items are being added
if($_POST['add']) {
	$product = $products[$_POST['id']];
	$cart->add_item($product['id'],$_POST['qty'],$product['price'],$product['name']);
}
if($_POST['remove']) {
	$rid = intval($_POST['id']);
	$cart->del_item($rid);

}

// spit some forms
// You can have many different types of forms, such as many quantity boxes
// and an "add to cart" button at the bottom which adds all items
// but for the purposes of this demo we will handle one item at a time. 
echo "<table>";
foreach($products as $p) {
	echo "<tr><td><form method='post' action='demo.php'>";
	echo "<input type='hidden' name='id' value='".$p['id']."'/>";
	echo "".$p['name'].' $'.number_format($p['price'],2)." ";
	echo "<input type='text' name='qty' size='5' value='1'><input type='submit' value='Add to cart' name='add'>";
	echo "</form></td></tr>";
}
echo "</table>";


echo "<h2>Items in cart</h2>";

if($cart->itemcount > 0) {
	foreach($cart->get_contents() as $item) {
		echo "<br />Item:<br/>";
		echo "Code/ID :".$item['id']."<br/>";
		echo "Quantity:".$item['qty']."<br/>";
		echo "Price   :$".number_format($item['price'],2)."<br/>";
		echo "Info    :".$item['info']."<br />";
		echo "Subtotal :$".number_format($item['subtotal'],2)."<br />";
		echo "<form method=post><input type='hidden' name='id' value='".$item['id']."'/><input type='submit' name='remove' value='Remove'/></form>";
	}
	echo "---------------------<br>";
	echo "total: $".number_format($cart->total,2);
} else {
	echo "No items in cart";
}

?>
und dann noch den für die Berechung (kann z.B. ins Plugin-Verzeichnis)

Code: Alles auswählen

<?php
/*
######################################################################
# __      __          __         ___                                 #
#/\ \  __/\ \        /\ \      /'___\                                #
#\ \ \/\ \ \ \     __\ \ \____/\ \__/  ___   _ __   ___     __       #
# \ \ \ \ \ \ \  /'__`\ \ '__`\ \ ,__\/ __`\/\`'__\/'___\ /'__`\     #
#  \ \ \_/ \_\ \/\  __/\ \ \L\ \ \ \_/\ \L\ \ \ \//\ \__//\  __/     #
#   \ `\___x___/\ \____\\ \_,__/\ \_\\ \____/\ \_\\ \____\ \____\    #
#    '\/__//__/  \/____/ \/___/  \/_/ \/___/  \/_/ \/____/\/____/    #
#                                                                    #
#     )   ___                                                        #
#    (__/_____)                      Webforce Cart v.1.5             #
#      /       _   __ _/_            (c) 2004-2005 Webforce Ltd, NZ  #
#     /       (_(_/ (_(__            webforce.co.nz/cart             #
#    (______)                        all rights reserved             #
#                                                                    #
#  Session based, Object Oriented Shopping Cart Component for PHP    #
#                                                                    #
######################################################################
# Ver 1.6 - Bugfix // Thanks James
# Ver 1.5 - Demo updated, Licence changed to LGPL
# Ver 1.4 - demo included
# Ver 1.3 - bugfix with total 
# Ver 1.2 - added empty_cart()
# Ver 1.0 - initial release
You are allowed to use this script in websites you create. 
Licence: LGPL - http://www.gnu.org/copyleft/lesser.txt
*** Instructions at http://www.webforce.co.nz/cart/php-cart.php ***
*** READ THEM!                                                 ***

BUGS/PATCHES

Please email eaden@webforce.co.nz with any bugs/fixes/patches/comments etc.
See http://www.webforce.co.nz/cart/ for updates to this script

*/
class wfCart {
	var $total = 0;
	var $itemcount = 0;
	var $items = array();
        var $itemprices = array();
	var $itemqtys = array();
        var $iteminfo = array();

	function cart() {} // constructor function

	function get_contents()
	{ // gets cart contents
		$items = array();
		foreach($this->items as $tmp_item)
		{
		        $item = FALSE;

			$item['id'] = $tmp_item;
                        $item['qty'] = $this->itemqtys[$tmp_item];
			$item['price'] = $this->itemprices[$tmp_item];
			$item['info'] = $this->iteminfo[$tmp_item];
			$item['subtotal'] = $item['qty'] * $item['price'];
                        $items[] = $item;
		}
		return $items;
	} // end of get_contents


	function add_item($itemid,$qty=1,$price = FALSE, $info = FALSE)
	{ // adds an item to cart
                if(!$price)
		{
		        $price = wf_get_price($itemid,$qty);
		}

                if(!$info)
		{
                        $info = wf_get_info($itemid);
		}

		if($this->itemqtys[$itemid] > 0)
                { // the item is already in the cart..
		  // so we'll just increase the quantity
			$this->itemqtys[$itemid] = $qty + $this->itemqtys[$itemid];
			$this->_update_total();
		} else {
			$this->items[]=$itemid;
			$this->itemqtys[$itemid] = $qty;
			$this->itemprices[$itemid] = $price;
			$this->iteminfo[$itemid] = $info;
		}
		$this->_update_total();
	} // end of add_item


	function edit_item($itemid,$qty)
	{ // changes an items quantity

		if($qty < 1) {
			$this->del_item($itemid);
		} else {
			$this->itemqtys[$itemid] = $qty;
			// uncomment this line if using 
			// the wf_get_price function
			// $this->itemprices[$itemid] = wf_get_price($itemid,$qty);
		}
		$this->_update_total();
	} // end of edit_item


	function del_item($itemid)
	{ // removes an item from cart
		$ti = array();
		$this->itemqtys[$itemid] = 0;
		foreach($this->items as $item)
		{
			if($item != $itemid)
			{
				$ti[] = $item;
			}
		}
		$this->items = $ti;
		$this->_update_total();
	} //end of del_item


        function empty_cart()
	{ // empties / resets the cart
                $this->total = 0;
	        $this->itemcount = 0;
	        $this->items = array();
                $this->itemprices = array();
	        $this->itemqtys = array();
                $this->iteminfo = array();
	} // end of empty cart


	function _update_total()
	{ // internal function to update the total in the cart
	        $this->itemcount = 0;
		$this->total = 0;
                if(sizeof($this->items > 0))
		{
                        foreach($this->items as $item) {
                                $this->total = $this->total + ($this->itemprices[$item] * $this->itemqtys[$item]);
				$this->itemcount++;
			}
		}
	} // end of update_total

}
?>
Mein Problem ist nun, dass dort ne session gestartet wird, es aber scheinbar schon eine offene session gibt (von Contenido??).

Leider sind meine PHP-Künste sehr rudimentär :cry:

Bitte helft mir doch, den Warenkorb zu integrieren, das ist bestimmt für viele hier interressant und leicht nachzuvollziehen.

Danke und viele Grüße,
Tom
tono
Beiträge: 574
Registriert: Mo 25. Apr 2005, 20:51
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitrag von tono »

Ähm, na ja,

Contenido verwendet eine Session-Verwaltung auf Basis von phplib. Es ist gut möglich, das sich die Contenido-Session und diese Session auf php-Basis nicht stören.

Da würde ich sagen probieren geht über studieren. Leg ein Modul an mit dem ersten Listing als Output. Leg die 2. Datei in cms/includes. Tausche im Modul

Code: Alles auswählen

include "wfcart.php";
gegen

Code: Alles auswählen

cInclude('frontend','includes/wfcart.php');
Bis dann
Tono
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

das problem dürfte hier einmal mehr weniger bei der session zu suchen sein, sondern in der tatsache, dass contenido zurzeit die ausgabe noch nicht puffert. deshalb ist ein session_start an dieser stelle vermutlich nicht möglich, da schon headers gesendet worden sind. das ganze ist allerdings nur eine vermutung. sollte bereits eine session vorliegen, dann kannst du den session_start einfach auskommentieren. vermutlich liegt das problem jedoch daran, dass bereits ausgaben gemacht worden sind. in diesem fall müssten du den session_start ebenfalls auskommentieren. dann einfach die entsprechende zeile an den anfang der front_content.php legen.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
tommo
Beiträge: 120
Registriert: So 27. Jun 2004, 21:34
Kontaktdaten:

Beitrag von tommo »

ja, wenn ich der session_start auskommentiere, dann wird mir der Warenkorb zwar angezeigt, aber sobald ich die Seite verlasse und wieder zurück kehre ist der Warenkorb wieder leer :? Schein also daran zu liegen, dass die session nicht mit übergeben wird.

Wenn ich es nicht auskommentiere, dann kommt der PHP Header-Fehler mit "...already sent"

Wie könnte ich denn die Session speichern?

Tom
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

wie gesagt: am anfang der front_content.php ein session_start() vornehmen.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
tommo
Beiträge: 120
Registriert: So 27. Jun 2004, 21:34
Kontaktdaten:

Beitrag von tommo »

@kummer

das geht leider auch nicht, da ich vor dem Sessionstart erst mal die wfcart.php includen muss und es dann wieder zu der Header-Fehlermeldung kommt

Code: Alles auswählen

// You must included wfcart.php BEFORE you start the session.
include "wfcart.php";
session_start();      // start the session 
Tom
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

dann führst du einfach die includierung auch gleich in der front_content.php vor dem session_start durch. diese datei macht ja selber keine ausgabe, sondern stellt einfach eine klasse zur verfügung.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
tommo
Beiträge: 120
Registriert: So 27. Jun 2004, 21:34
Kontaktdaten:

Beitrag von tommo »

Ahh jetzt, der Fehler kam, da in der wfcart.php am Schluss noch eine Leerzeile war. Jetzt scheint's zu klappen, ich werde Berichten und veröffentlichen :wink:

Gruß,
Tom
barni
Beiträge: 127
Registriert: Fr 28. Okt 2005, 20:54
Kontaktdaten:

Beitrag von barni »

Hallo Tom,

gibts bei dir einen aktuellen Stand?
genau sowas brauch ich gerade auch.

Danke
Sebastian
ich bin genauso hilflos wie ich tu ;)
caps-log
Beiträge: 94
Registriert: Fr 5. Dez 2003, 09:56
Wohnort: Waiblingen
Kontaktdaten:

Re:

Beitrag von caps-log »

Hi,
ich recherchiere gerade nach einer Shop-Anwendung, die sich nahtlos in Contenido integrieren lässt,
womit ich vor allem die bekannte Artikelverwaltung von Contenido meine. Hat deine Lösung geklappt?
Ciao, Torsten


tommo hat geschrieben:Ahh jetzt, der Fehler kam, da in der wfcart.php am Schluss noch eine Leerzeile war. Jetzt scheint's zu klappen, ich werde Berichten und veröffentlichen :wink:

Gruß,
Tom
Hebt man den Blick,
so sieht man keine Grenzen.
(Aus Japan)

torsten w. licker
caps-log.de/sign
Gesperrt