If I'm welcomed to post code, here it is :-)
Code:
<?php
class OptionPricing extends base {
var $conditions = array();
var $changes = array();
var $prices = array();
function OptionPricing(){
global $zco_notifier;
$zco_notifier->attach($this, array(
'NOTIFIER_CART_CALCULATE_ATTRIBUTE',
'NOTIFIER_CART_ATTRIBUTE_PRICE_SELECT',
'NOTIFY_HEADER_SHOPPING_CART_OPTION_PRICE',
'NOTIFY_ORDER_CART_FINISHED'
));
}
function update(&$class, $eventID, $paramsArray) {
switch($eventID) {
case 'NOTIFY_HEADER_SHOPPING_CART_OPTION_PRICE':
$this->loadRules($paramsArray['products_id']);
//$paramsArray->fields['options_values_price'] = 0.00;
break;
case 'NOTIFIER_CART_CALCULATE_ATTRIBUTE':
case 'NOTIFIER_CART_ATTRIBUTE_PRICE_SELECT':
if (isset($paramsArray['cart']->contents[$paramsArray['products_id']]) &&
isset($paramsArray['cart']->contents[$paramsArray['products_id']]['attributes'])){
$this->loadRules((int)$paramsArray['products_id']);
$paramsArray['options_id'] = (int)$paramsArray['options_id'];
// look thru changes to see if this options price is ever adjusted
if ( isset($this->changes[(int)$paramsArray['products_id']]) ) {
foreach($this->changes[(int)$paramsArray['products_id']] as $ind => $pchanges){
if (isset($pchanges[$paramsArray['options_id']])) {
$values = explode(',',$pchanges[$paramsArray['options_id']]);
//var_dump($pchanges[$paramsArray['options_id']],$values);
if (in_array($paramsArray['options_values_id'],$values)) {
// this option price is adjusted... check to see if conditions met.. if so, change price
if (isset($this->conditions[(int)$paramsArray['products_id']][$ind])){
$option = (int)key($this->conditions[(int)$paramsArray['products_id']][$ind]);
$value = (int)$this->conditions[(int)$paramsArray['products_id']][$ind][$option];
if ((isset($paramsArray['cart']->contents[$paramsArray['products_id']]['attributes'][$option]) && $paramsArray['cart']->contents[$paramsArray['products_id']]['attributes'][$option] == $value) ||
( isset($paramsArray['cart']->contents[$paramsArray['products_id']]['attributes'][$option.'_chk'.$value]) ) ) {
$paramsArray['rs']->fields['options_values_price'] = $this->prices[(int)$paramsArray['products_id']][$ind][$paramsArray['options_id']];
}
}
}
}
}
}
}
//$paramsArray['rs']->fields['options_values_price'] = 0.00;
break;
case 'NOTIFY_ORDER_CART_FINISHED':
foreach($paramsArray->products as $pind => $product){
if (isset($product['attributes'])) {
$this->loadRules($product['id']);
foreach($this->conditions[(int)$product['id']] as $ind => $conditions){
foreach($conditions as $option_id => $values){
$values = explode(',',$values);
foreach($values as $value){
$value = (int)$value;
foreach($product['attributes'] as $aind => $attribute){
if ( ($attribute['option_id'] == (int)$option_id || $attribute['option_id'] == $option_id.'_chk'.$value) &&
($attribute['value_id'] == $value) ) {
// condition met, check for changes
//var_dump('ind: '.$ind,$this->changes[(int)$product['id']][$ind]);
foreach($this->changes[(int)$product['id']][$ind] as $coption_id => $cvalues){
$cvalues = explode(',',$cvalues);
foreach($cvalues as $cvalue){
$cvalue = (int)$cvalue;
foreach($product['attributes'] as $aind2 => $attribute2){
if ( ($attribute2['option_id'] == (int)$coption_id || $attribute2['option_id'] == $coption_id.'_chk'.$cvalue) &&
($attribute2['value_id'] == $cvalue) ) {
// set new price
$new_price = $this->prices[(int)$product['id']][$ind][$coption_id];
$paramsArray->products[$pind]['attributes'][$aind2]['price'] = $new_price;
}
}
}
}
}
}
}
}
}
}
}
break;
}
}
function loadRules($pID){
global $db;
$pID = (int)$pID;
if (!isset($this->conditions[$pID])) {
$this->conditions[$pID] = array();
$this->changes[$pID] = array();
$this->prices[$pID] = array();
$rules = $db->Execute("SELECT * FROM ".TABLE_OPTION_PRICING." WHERE products_id = ".(int)$pID);
while(!$rules->EOF){
$this->conditions[$pID][] = unserialize(base64_decode($rules->fields['conditions']));
$this->changes[$pID][] = unserialize(base64_decode($rules->fields['changeoptions']));
$this->prices[$pID][] = unserialize(base64_decode($rules->fields['prices']));
$rules->MoveNext();
}
}
}
}
This is the class I found in /includes/classes/observers/
it fires me a bunch of debug files saying Invalid argument supplied for foreach() in line 76.
Line 76 is
Code:
foreach($paramsArray->products as $pind => $product)
But as far as I understand line 76 is not the culprit, I'm most inclined to modify the class definition beginning, replacing :
Code:
function OptionPricing(){
global $zco_notifier;
$zco_notifier->attach($this, array(
'NOTIFIER_CART_CALCULATE_ATTRIBUTE',
'NOTIFIER_CART_ATTRIBUTE_PRICE_SELECT',
'NOTIFY_HEADER_SHOPPING_CART_OPTION_PRICE',
'NOTIFY_ORDER_CART_FINISHED'
));
}
by
Code:
function __construct() {
$this->attach($this, array('NOTIFIER_CART_CALCULATE_ATTRIBUTE',
'NOTIFIER_CART_ATTRIBUTE_PRICE_SELECT',
'NOTIFY_HEADER_SHOPPING_CART_OPTION_PRICE',
'NOTIFY_ORDER_CART_FINISHED'));
}
Is that solving my problem ? Would my functions still find my variables ?
Bookmarks