Zurück   xt:Commerce Webshop Shop Support > xt:Commerce Shopsoftware Community Area > Modul Entwicklung

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 28.03.2011, 07:49
FKL FKL ist offline
Neuer Benutzer
 
Registriert seit: 08.12.2010
Beiträge: 2
Frage Tabellarische Versandkosen: PHP - Dateien modifizieren

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ß
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #2 (permalink)  
Alt 16.11.2011, 19:58
Neuer Benutzer
 
Registriert seit: 07.02.2008
Beiträge: 20
Standard

hallo,
hast du eine lösung für das problem gefunden?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #3 (permalink)  
Alt 17.11.2011, 08:10
FKL FKL ist offline
Neuer Benutzer
 
Registriert seit: 08.12.2010
Beiträge: 2
Standard

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,10 025: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-Code:
<?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&ouml;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&ouml;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"] == || ( $kf_db_array["categories_id"] == && $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&ouml;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_b)." __ ".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');
    }
  }
?>


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

Datei: lang/german/modules/shipping/table01.php

PHP-Code:
<?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 &uuml;ber DPD &amp; TNT (voraussichtlich 5-7 Tage)');
define('MODULE_SHIPPING_TABLE01_TEXT_DESCRIPTION''Versand &uuml;ber DPD &amp; 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&ouml;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&uuml;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&uuml; 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&uuml;hr');
define('MODULE_SHIPPING_TABLE01_HANDLING_DESC' 'Handling Geb&uuml;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&auml;hlt ist, wird diese Versandmethode ausschliseslich f&uuml;r diese Zone angewendet');
define('MODULE_SHIPPING_TABLE01_SORT_ORDER_TITLE' 'Sortierreihenfolge');
define('MODULE_SHIPPING_TABLE01_SORT_ORDER_DESC' 'Reihenfolge der Anzeige');
?>

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 ^^

Geändert von FKL (17.11.2011 um 08:12 Uhr)
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
dateien, modifizieren, php, tabellarische, versandkosen

Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Installationsprobleme Apache/winxp wini2 Installation und Konfiguration 18 28.10.2008 11:57


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.

Copyright © 2011 xt:Commerce GmbH / xt:Commerce International Ltd. - All Rights Reserved

xt:Commerce is a SafeCharge brand