Lösung für: Anzeige Versandkostenstaffelung

Hallo zusammen,
habe eine kleine individuelle Lösung umgesetzt, um in der rechten Spalte eine Tabelle mit der Versandkostenstaffelung für das aktuelle Land anzuzeigen (sieht dann aus wie im angehängten Screenshot).
Die Lösung setzt einiges voraus, z.B. daß der Nutzer eingeloggt ist und seine Lieferadresse im selben Land wie die Rechnungsadresse ist (die wird nämlich abgefragt). Außerdem gehe ich davon aus, dass die Versandkosten abhg. vom Warenkorbgesamtwert berechnet werden.
Anpassungen können und müssen also gemacht werden.
(Wie immer Benutzung ohne Gewährleistung und auf eigenes Risiko!)

Die notwendigen Funktionen habe ich ein bestehendes Modul gepackt, das core/oxuser.php ergänzt.
Zum Testen kann man das also erstmal direkt in oxuser.php reinschreiben und später in ein separates Modul auslagern:


    // fk helper function to get country ISO by its DB id
    public function getCountryISO($sCountryId)
    {
      $sCountryISO = "";
      
      $oDb = oxDb::getDb();
      
	$sSql = "SELECT OXISOALPHA2 FROM oxcountry 
      WHERE OXID   = '" . $sCountryId . "' 
      LIMIT 1
      ";
	$sCountryISO = $oDb->getOne($sSql);            
      
      return $sCountryISO;
    } // getCountryISO()

    /**
     * return array with shipment cost rules for active country     
     *
     * @return array
     */
    public function getDelCostOfCountry($sCountryID)
    {
        $aDelCost = array();
        
        // find shipment rules assigned to this country
        $oDb = oxDb::getDb();

  			$sSql = "
        SELECT t1.oxdeliveryid, t2.oxparam, t2.oxparamend, t2.oxaddsum 
        FROM oxobject2delivery t1 
        RIGHT JOIN oxdelivery t2
        ON t1.oxdeliveryid = t2.oxid
        WHERE t1.oxobjectid = '" . $sCountryID . "'         
        AND t1.oxtype = 'oxcountry'
        AND t2.oxactive = 1
        AND t2.oxfinalize = 1
        AND t2.oxaddsumtype = 'abs'
        ORDER BY t2.oxparam ASC 
        ";
        
        $sRes = $oDb->getAll($sSql); 		
  			  			  			  			
  			foreach($sRes as $row)
  			{
  			 // fetch only two most important values (oxparam and oxaddsum) 
  			 $aDelCost[$row[1]] = $row[3]; 
        }
  	  			                
        return $aDelCost;
    }    

Das hier kommt anschliessend in _right.tpl:

[{ assign var="aDelCost" value=$oxcmp_user->getDelCostOfCountry($oxcmp_user->oxuser__oxcountryid->value) }]
[{ assign var="isocountry" value=$oxcmp_user->getCountryISO($oxcmp_user->oxuser__oxcountryid->value) }]
[{ assign var="actCurr" value=$oView->getActCurrency() }]


<div class="box">

<p><b>[{ oxmultilang ident="SHIPMENT_TO" }] [{ $isocountry }]</b></p> 
<table id="shipment">
<tr>
<th>[{ oxmultilang ident="ORDER_VALUE" }]</th>
<th>[{ oxmultilang ident="SHIPMENT_COST" }]</th>
</tr>

[{foreach from=$aDelCost key=k item=v}]
<tr>
<td>>[{$k * $actCurr->rate}] [{$actCurr->sign}]</td>
<td>[{if ($v == 0)}][{oxmultilang ident="FREE"}][{else}][{$v * $actCurr->rate}] [{$actCurr->sign}][{/if}]</td>
</tr>
[{/foreach}]

</table>
</div>

Die entsprechenden Einträge in den jeweiligen Sprachdateien erklären sich von selbst…

Viel Spaß damit!
floko

Setzt Du das in den Exchange? http://www.oxid-esales.com/de/exchange
Oder auf OXIDprojects? http://projects.oxidforge.org/
Oder zumindest ins Wiki? http://wiki.oxidforge.org/Tutorials/de

Das geht sonst definitiv mit der Zeit hier unter im Forum.