Jump to content
xt:Commerce Community Forum

Tabellarische Versandkosen: PHP - Dateien modifizieren


FKL

Recommended Posts

Hallo,

bei einem Shop für Meterware sollen die Versandkosten nicht nur tabellarisch nach Gewicht gestaffelt sein, vielmehr soll es - je nach Länge der bestellten Artikel - unterschiedliche Preistaffeln geben.

Zum Beispiel für Bestellungen unter 2 Meter Gewichtsstaffelung 1,

für Bestellungen über 2 Meter Gewichtsstaffelung 2.

Meine Idee war nun, das normale Modul "Tabellarische Versandkosten" zu kopieren und dort die Berechnung an zu passen, und eben auch dort per Datenbankabfrage die Länge der Artikel zu ermittlen.

Ich muss leider sagen, das ich aus dem Code in der entsprechenden Datei tables.php nicht wirklich schlau werde. Gibt es noch andere Dateien, welche ich mir anschauen muss, wenn ich in die Berechnung eingreifen möchte? An welchen Stellen muss ich dort ansetzen?

Für Hilfe wäre ich sehr dankbar.

Gruß

Link to comment
Share on other sites

  • 7 months later...

Hi. Puh, fast vergessen das Thema hier. Habe es dann lösen können:

Prinzipiell habe ich die Staffelung nach Gewicht etwas zweckentfremdet. So addiere ich zum Gesamtgewicht der Bestellung eine große Zahl (10000 z.B.), wenn ein Artikel im Warenkorb die maximale Länge / Höhe übertrifft. So greift ab einem Gewicht über 10000 die zweite Staffelung.

Damit kann man im Admin-Bereich dann die gewünschte doppelte Staffelung nach Gewicht und Länge umsetzen.

- Preisstaffelung nach Gewicht UNTER / BIS zum Maximalwert Länge / Höhe

- Preisstaffelung nach Gewicht ÜBER dem Maximalwert Länge / Höhe

5:9.80,10:11.80,15:13.90,20:15.90:25:17.90,31.5:19.90,9999:19.90,10005:19.95,10010:22.90,10015:24.90,10020:28.90,10025:32.90,10030:36.90,10050:49,10060:59,99999:59

- Es wird in einer Schleife für jeden Artikel im Warenkorb jeweils die Höhe und Breite ausgelesen und verglichen. So erhalten wir am Schluss den größten (=längsten) Wert. Zu beachten ist, dass tatsaechlich auf Optionswerte mit dem Namen "Hoehe" und "Breite" zugegriffen wird, sprich es muss auch genau so benannte Optionswerte geben. Alles nicht so toll, ich weiss :-P

- Dann wird geprüft, ob dieser Wert über unserem Schwellenwert (unten 2 Meter, leider hart codiert) liegt. Ist das der Fall, wird dem Gesamtgewicht der Bestellung am Schluss 10000 hinzuaddiert.

Es folgt der komplette Code der tables.php Datei (bzw. tables01.php, da das Originalmodul kopiert wurde). Alle Angaben ohne Gewähr, ich hoffe es hilft.

Datei: includes/modules/shipping/table01.php

<?php
/* -----------------------------------------------------------------------------------------
$Id: table.php 1002 2005-07-10 16:11:37Z mz $

XT-Commerce - community made shopping
http://www.xt-commerce.com

Copyright (c) 2003 XT-Commerce
-----------------------------------------------------------------------------------------
based on:
(c) 2000-2001 The Exchange Project (earlier name of osCommerce)
(c) 2002-2003 osCommerce(table.php,v 1.27 2003/02/05); www.oscommerce.com
(c) 2003 nextcommerce (table.php,v 1.8 2003/08/24); www.nextcommerce.org

Released under the GNU General Public License
---------------------------------------------------------------------------------------*/


class table01 {
var $code, $title, $description, $icon, $enabled;


function table01() {
global $order;

$this->code = 'table01';
$this->title = MODULE_SHIPPING_TABLE01_TEXT_TITLE;
$this->description = MODULE_SHIPPING_TABLE01_TEXT_DESCRIPTION;
$this->sort_order = MODULE_SHIPPING_TABLE01_SORT_ORDER;
$this->icon = '';
$this->tax_class = MODULE_SHIPPING_TABLE01_TAX_CLASS;
$this->enabled = ((MODULE_SHIPPING_TABLE01_STATUS == 'True') ? true : false);

if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_TABLE01_ZONE > 0) ) {
$check_flag = false;
$check_query = xtc_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_SHIPPING_TABLE01_ZONE . "' and zone_country_id = '" . $order->delivery['country']['id'] . "' order by zone_id");
while ($check = xtc_db_fetch_array($check_query)) {
if ($check['zone_id'] < 1) {
$check_flag = true;
break;
} elseif ($check['zone_id'] == $order->delivery['zone_id']) {
$check_flag = true;
break;
}
}

if ($check_flag == false) {
$this->enabled = false;
}

}
}


function quote($method = '') {
global $order, $shipping_weight, $shipping_num_boxes,$xtPrice;





// Staffelung nach Bestellwert
if (MODULE_SHIPPING_TABLE01_MODE == 'price') {
$order_total = $xtPrice->xtcRemoveCurr($_SESSION['cart']->show_total());

} else {

// Staffelung urspruenglich nach Gewicht, jetzt nach max. Laenge / Hoehe

// Hier die Laenge der Artikel auslesen..
// ersteinmal herausfinden, welche Options-ID die Optionen "Höhe" und "Breite" haben,
// da diese nur mit jener ID im $order - Objekt hinterlegt sind.

$kf_hoehe_id = 0;
$kf_breite_id = 0;
$kf_qmGewicht_id = 0;

$kf_query = xtc_db_query("select products_options_id from " . TABLE_PRODUCTS_OPTIONS . " where products_options_name = 'Höhe'");
while ($kf_db_array = xtc_db_fetch_array($kf_query)) {
foreach($kf_db_array as $key => $value){
if($kf_db_array["products_options_id"]){
$kf_hoehe_id = $kf_db_array["products_options_id"];
}
}
}

$kf_query = xtc_db_query("select products_options_id from " . TABLE_PRODUCTS_OPTIONS . " where products_options_name = 'Breite'");
while ($kf_db_array = xtc_db_fetch_array($kf_query)) {
foreach($kf_db_array as $key => $value){
if($kf_db_array["products_options_id"]){
$kf_breite_id = $kf_db_array["products_options_id"];
}
}
}

$kf_query = xtc_db_query("select products_options_id from " . TABLE_PRODUCTS_OPTIONS . " where products_options_name = 'Gewicht'");
while ($kf_db_array = xtc_db_fetch_array($kf_query)) {
foreach($kf_db_array as $key => $value){
if($kf_db_array["products_options_id"]){
$kf_qmGewicht_id = $kf_db_array["products_options_id"];
}
}
}



$kf_maxHoehe = 0; // Die groesste bisher im Warenkorb gefundene Hoehe
$kf_maxBreite = 0; // Die groesste bisher im Warenkorb gefundene Breite
$kf_qmGesamtGewicht = 0;
$kf_leuchtkaesten = 0;

$kf_inklVersand = 0;
$kf_exklVersand = 0;

// Jeweils Hoehe und Breite eines jeden Produkts im Warenkorb ermitteln.
// Fuer jedes Produkt:
foreach($order->products as $key => $value){

$kf_pid = $order->products[$key]["id"][0];
$kf_pid .= $order->products[$key]["id"][1];
// echo $kf_pid."<br/>";

$kf_query = xtc_db_query("select categories_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where products_id = '".$order->products[$key]["id"]."'");
while ($kf_db_array = xtc_db_fetch_array($kf_query)) {

if($kf_db_array["categories_id"]){
// produkt: klebefolie 25
// 3: l, 2: k

//echo $kf_db_array["categories_id"]." - ";

if($kf_db_array["categories_id"] == 3 || ( $kf_db_array["categories_id"] == 2 && $order->products[$key]["id"] != 25) ){
$kf_inklVersand++;
}
else{
$kf_exklVersand++;
}


}

}



// echo $kf_inklVersand." - ".$kf_exklVersand." | ";


// Fuer jedes Attribut dieses Produktes
if($order->products[$key]["attributes"]){

foreach($order->products[$key]["attributes"] as $k => $v){

// Wenn es das Attribut "Höhe" ist (dessen ID wir vorhin ermittelt haben)
if($order->products[$key]["attributes"][$k]["option_id"] == $kf_hoehe_id){

// echo "Hoehe: ".$order->products[$key]["attributes"][$k]["value_id"]."<br/>";
$kf_tmp_h = $order->products[$key]["attributes"][$k]["value_id"];
if($kf_tmp_h > $kf_maxHoehe){
$kf_maxHoehe = $kf_tmp_h;
}
}

// Wenn es das Attribut "Breite" ist (dessen ID wir vorhin ermittelt haben)
if($order->products[$key]["attributes"][$k]["option_id"] == $kf_breite_id){
// echo "Breite: ".$order->products[$key]["attributes"][$k]["value_id"]."<br/>";
$kf_tmp_b = $order->products[$key]["attributes"][$k]["value_id"];

// echo "|_ ".gettype($kf_tmp_." __ ".gettype($kf_maxBreite);
if($kf_tmp_b > $kf_maxBreite){
$kf_maxBreite = $kf_tmp_b;
}
}

// Wenn es das Attribut "Gewicht" ist (dessen ID wir vorhin ermittelt haben)
if($order->products[$key]["attributes"][$k]["option_id"] == $kf_qmGewicht_id){
$kf_qmGesamtGewicht += $order->products[$key]["qty"] * $order->products[$key]["attributes"][$k]["value_id"];


}
}
}
}




// So, jetzt haben wir die maximale Hoehe und Breite ermittelt. Jetzt wird von diesen
// beiden Werten der laengere genommen. Falls dieser Wert UNTER 2 Metern liegt, passiert
// nicht viel und das 'normale' Gewicht wird hergenommen.

// Folgende Abfragen gehen auf Breite UND Hoehe los

$kf_max = 0;
if($kf_maxBreite >= $kf_maxHoehe){
$kf_max = $kf_maxBreite;
}
else{
$kf_max = $kf_maxHoehe;
}


if($kf_max > 200){
$order_total = $shipping_weight + $kf_qmGesamtGewicht + 10000;
}
else{
$order_total = $shipping_weight + $kf_qmGesamtGewicht;
}


}





$table_cost = split("[:,]" , MODULE_SHIPPING_TABLE01_COST);
$size = sizeof($table_cost);
for ($i=0, $n=$size; $i<$n; $i+=2) {
if ($order_total <= $table_cost[$i]) {
$shipping = $table_cost[$i+1];
break;
}
}

if (MODULE_SHIPPING_TABLE01_MODE == 'weight') {
$shipping = $shipping * $shipping_num_boxes;
}




$this->quotes = array('id' => $this->code,
'module' => MODULE_SHIPPING_TABLE01_TEXT_TITLE,
'methods' => array(array('id' => $this->code,
'title' => MODULE_SHIPPING_TABLE01_TEXT_WAY,//" (".round($kf_qmGesamtGewicht+$shipping_weight,2)." kg)", //
'cost' => $shipping + MODULE_SHIPPING_TABLE01_HANDLING)));

if ($this->tax_class > 0) {
$this->quotes['tax'] = xtc_get_tax_rate($this->tax_class, $order->delivery['country']['id'], $order->delivery['zone_id']);
}

if (xtc_not_null($this->icon)) $this->quotes['icon'] = xtc_image($this->icon, $this->title);

return $this->quotes;
}

function check() {
if (!isset($this->_check)) {
$check_query = xtc_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_SHIPPING_TABLE01_STATUS'");
$this->_check = xtc_db_num_rows($check_query);
}
return $this->_check;
}

function install() {
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added) VALUES ('MODULE_SHIPPING_TABLE01_STATUS', 'True', '6', '0', 'xtc_cfg_select_option(array(\'True\', \'False\'), ', now())");
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added) values ('MODULE_SHIPPING_TABLE01_ALLOWED', '', '6', '0', now())");
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added) values ('MODULE_SHIPPING_TABLE01_COST', '25:8.50,50:5.50,10000:0.00', '6', '0', now())");
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, set_function, date_added) values ('MODULE_SHIPPING_TABLE01_MODE', 'weight', '6', '0', 'xtc_cfg_select_option(array(\'weight\', \'price\'), ', now())");
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added) values ('MODULE_SHIPPING_TABLE01_HANDLING', '0', '6', '0', now())");
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, use_function, set_function, date_added) values ('MODULE_SHIPPING_TABLE01_TAX_CLASS', '0', '6', '0', 'xtc_get_tax_class_title', 'xtc_cfg_pull_down_tax_classes(', now())");
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, use_function, set_function, date_added) values ('MODULE_SHIPPING_TABLE01_ZONE', '0', '6', '0', 'xtc_get_zone_class_title', 'xtc_cfg_pull_down_zone_classes(', now())");
xtc_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_key, configuration_value, configuration_group_id, sort_order, date_added) values ('MODULE_SHIPPING_TABLE01_SORT_ORDER', '0', '6', '0', now())");
}

function remove() {
xtc_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
}

function keys() {
return array('MODULE_SHIPPING_TABLE01_STATUS', 'MODULE_SHIPPING_TABLE01_COST', 'MODULE_SHIPPING_TABLE01_MODE', 'MODULE_SHIPPING_TABLE01_HANDLING','MODULE_SHIPPING_TABLE01_ALLOWED', 'MODULE_SHIPPING_TABLE01_TAX_CLASS', 'MODULE_SHIPPING_TABLE01_ZONE', 'MODULE_SHIPPING_TABLE01_SORT_ORDER');
}
}
?>[/PHP]

Und der Vollständigkeit halber, damit das ganze als weiteres Versandkostenmodul auftaucht, brauchen wir auch die entsprechende Sprachdatei:

[b]Datei: lang/german/modules/shipping/table01.php[/b]

[PHP]<?php
/* -----------------------------------------------------------------------------------------
$Id: table.php 899 2005-04-29 02:40:57Z hhgag $

XT-Commerce - community made shopping
http://www.xt-commerce.com

Copyright (c) 2003 XT-Commerce
-----------------------------------------------------------------------------------------
based on:
(c) 2000-2001 The Exchange Project (earlier name of osCommerce)
(c) 2002-2003 osCommerce(table.php,v 1.6 2003/02/16); www.oscommerce.com
(c) 2003 nextcommerce (table.php,v 1.4 2003/08/13); www.nextcommerce.org

Released under the GNU General Public License
---------------------------------------------------------------------------------------*/

define('MODULE_SHIPPING_TABLE01_TEXT_TITLE', 'Versand über DPD & TNT (voraussichtlich 5-7 Tage)');
define('MODULE_SHIPPING_TABLE01_TEXT_DESCRIPTION', 'Versand über DPD & TNT');
define('MODULE_SHIPPING_TABLE01_TEXT_WAY', '');
define('MODULE_SHIPPING_TABLE01_TEXT_WEIGHT', 'Gewicht');
define('MODULE_SHIPPING_TABLE01_TEXT_AMOUNT', 'Menge');

define('MODULE_SHIPPING_TABLE01_STATUS_TITLE' , 'Individuelle Versandkosten aktivieren');
define('MODULE_SHIPPING_TABLE01_STATUS_DESC' , 'Möchten Sie Individuelle Versandkosten anbieten?');
define('MODULE_SHIPPING_TABLE01_ALLOWED_TITLE' , 'Erlaubte Versandzonen');
define('MODULE_SHIPPING_TABLE01_ALLOWED_DESC' , 'Geben Sie <b>einzeln</b> die Zonen an, in welche ein Versand möglich sein soll. (z.B. AT,DE (lassen Sie dieses Feld leer, wenn Sie alle Zonen erlauben wollen))');
define('MODULE_SHIPPING_TABLE01_COST_TITLE' , 'Versandkosten');
define('MODULE_SHIPPING_TABLE01_COST_DESC' , 'Die Versandkosten basieren auf Gesamtkosten oder Gesamtgewicht der bestellten Waren. Beispiel: 25:5.50,50:8.50,etc.. Bis 25 werden 5.50 verrechnet, darüber bis 50 werden 8.50 verrechnet, etc. Um die zweite Staffelung (ab 2 Metern) anzusprechen, vor das Gewicht mit 10000 addieren. Also z.B. fü eine Lieferung ueber 2 Metern, bis 5 Kilo, 2 Euro: 10005:2');
define('MODULE_SHIPPING_TABLE01_MODE_TITLE' , 'Versandkosten Methode');
define('MODULE_SHIPPING_TABLE01_MODE_DESC' , 'Die Versandkosten basieren auf Gesamtkosten oder Gesamtgewicht der bestellten Waren.');
define('MODULE_SHIPPING_TABLE01_HANDLING_TITLE' , 'Handling Gebühr');
define('MODULE_SHIPPING_TABLE01_HANDLING_DESC' , 'Handling Gebühr für diese Versandmethode');
define('MODULE_SHIPPING_TABLE01_TAX_CLASS_TITLE' , 'Steuerklasse');
define('MODULE_SHIPPING_TABLE01_TAX_CLASS_DESC' , 'Folgende Steuerklasse an Versandkosten anwenden');
define('MODULE_SHIPPING_TABLE01_ZONE_TITLE' , 'Versandzone');
define('MODULE_SHIPPING_TABLE01_ZONE_DESC' , 'Wenn eine Zone ausgewählt ist, wird diese Versandmethode ausschliseslich für diese Zone angewendet');
define('MODULE_SHIPPING_TABLE01_SORT_ORDER_TITLE' , 'Sortierreihenfolge');
define('MODULE_SHIPPING_TABLE01_SORT_ORDER_DESC' , 'Reihenfolge der Anzeige');
?>[/PHP]

Wenn ich an das ganze gehacke denke, wird mir immernoch anders. Aber auch viel gelernt bei dem Projekt. Unter anderem, dass XT und Derivate keinen Spaß machen, sobald man was anpassen will ^^

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
  • Create New...