* *@version 0.3 * *@package Quinta * @subpackage Modules */ class CheckOutEditModule extends QPanel{ /** * ContentBlock contains the data and main functions for the check out module. * @var CheckOutModule - both the DOM parent object and the control block passed to submodules */ protected $objControlBlock; protected $objShippingAddress; protected $objBillingAddress; /** * This module shows a panel containing the items on the order with modifiable quantity fields * and a remove button. * @var CheckOutItemListModule - lists order items */ public $objCheckOutItemListModule; /** * @var CheckOutTotalsController - module to display shipping, handling and total price for order */ public $objCheckOutTotalsController; /** * This module shows a panel containing the address for the order * @var AddressController */ public $objShippingAddressController; public $objBillingAddressController; /** * This module shows a panel for editting the addresses for the order. It is called with a parameter * to determine which of the addresses to edit (Billing | Shipping) * @var AddressController */ public $objAddressEditPanel; /** * @var QButton control buttons to edit the address fields */ public $btnChangeShipping; public $btnChangeBilling; /** * This is here only because technically PayPal requires that you have two points of entry into their * scheme .. one is supposed to be on the "shopping cart page" - that is a pain to set up and putting * it here makes more sense as we want to offer shipping options. Besides, I don't like the idea * of sending the customer to approve a payment amount and _then_ adding shipping - too sleazy * for my troublesome sense of ethics ... * @var QImageButton button to show on the first panel to support PayPal Express Checkout */ public $btnPayPalExpressButton; /** * Module constructor * NOTE: This module ignores the required extra parameters .. *@param ContentBlock - parent controller object. *@param mixed - extra parameters, ignored */ public function __construct( CheckOutModule $objControlBlock, $mixParameters=null){ try { parent::__construct($objControlBlock); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } $this->objControlBlock =& $objControlBlock; $this->objShippingAddress =& $this->objControlBlock->objShippingAddress; $this->objBillingAddress =& $this->objControlBlock->objBillingAddress; $this->strTemplate = __QUINTA_CORE_VIEWS__ . '/CheckOutEditModule.tpl.php'; $this->objCheckOutItemListModule = new CheckOutItemListModule($this, $objControlBlock); $this->objCheckOutItemListModule->initItemList($objControlBlock->aryOrderItems); $this->objShippingAddressController = new AddressController($this, $this->objShippingAddress->Id, 'ShippingAddress: ', 'ShippingAddressController' ); $this->objBillingAddressController = new AddressController($this, $this->objBillingAddress->Id, 'BillingAddress: ', 'BillingAddressController' ); $this->objShippingAddressController->AutoRenderChildren = true; $this->objBillingAddressController->AutoRenderChildren = true; $this->objCheckOutTotalsController = new CheckOutTotalsController($this); // grab shipping charges from shipping module if possible.. if( $this->objControlBlock->ShippingModule instanceof ShippingModule && $this->objControlBlock->ShippingMethod instanceof ShippingMethod) $this->objCheckOutTotalsController->ShippingCharge = $this->objShippingModule->SelectedMethod->Rate; else $this->objCheckOutTotalsController->ShippingCharge = 0; /// @todo make handling charge configurable. $this->objCheckOutTotalsController->HandlingCharge = 10.0; $this->objCheckOutTotalsController->TotalItemsCharge = $this->objCheckOutItemListModule->ItemsTotalPrice; $this->objCheckOutTotalsController->RefreshTotal(); $this->btnChangeShipping = new QButton($this->objShippingAddressController); $this->btnChangeShipping->Text = Quinta::Translate('Change'); if(IndexPage::$blnAjaxOk) $this->btnChangeShipping->AddAction(new QClickEvent(), new QAjaxControlAction($this, 'btnChangeAddress_Click')); else $this->btnChangeShipping->AddAction(new QClickEvent(), new QServerControlAction($this, 'btnChangeAddress_Click')); $this->btnChangeShipping->ActionParameter = 'Shipping'; $this->btnChangeShipping->CausesValidation = $this; $this->btnChangeBilling = new QButton($this->objBillingAddressController); $this->btnChangeBilling->Text = Quinta::Translate('Change'); if(IndexPage::$blnAjaxOk) $this->btnChangeBilling->AddAction(new QClickEvent(), new QAjaxControlAction($this, 'btnChangeAddress_Click')); else $this->btnChangeBilling->AddAction(new QClickEvent(), new QServerControlAction($this, 'btnChangeAddress_Click')); $this->btnChangeBilling->ActionParameter = 'Billing'; $this->btnChangeBilling->CausesValidation = $this; } public function btnChangeAddress_Click($strFormId, $strControlId, $strParameters){ $aryParameters = explode(',',$strParameters); switch($aryParameters[0]){ case 'Billing': $this->ShowAddressEditPanel($this->objBillingAddress->Id); break; case 'Shipping': $this->ShowAddressEditPanel($this->objShippingAddress->Id); break; case 'New': $this->ShowAddressEditPanel(); break; default: throw new QCallerException('Unknown Address change - ' . $aryParameters[0] ); } } /** * Shows the panel to the selected shipping address, hiding all the others. */ public function ShowAddressEditPanel($intAddressId=null){ $this->objCheckOutItemListModule->Visible = false; $this->objShippingAddressController->Visible = false; $this->objBillingAddressController->Visible = false; $this->objControlBlock->btnContinue->Visible = false; $this->objControlBlock->ShippingModule->Visible = false; $this->objAddressEditPanel = new AccountAddressEditPanel($this, $this, 'CloseAddressEditPanel', $intAddressId ); //set a template that doesn't show the delete button .. $this->objAddressEditPanel->Template = __QUINTA_CORE_VIEWS__ . '/CheckOutAddressEditPanel.tpl.php'; $this->objAddressEditPanel->Visible = true; } /** * Closes the address editting panel, updates the addresses and shows the CheckOutEditModule again. *@todo implement reloading the address data, for now its just a brute force kludge to update the page. */ public function CloseAddressEditPanel($blnUpdatesMade){ Quinta::Redirect(__QUINTA_SUBDIRECTORY__ . '/index.php/CheckOut'); /* $this->objAddressEditPanel->Visible = false; // update the addresses $this->objShippingAddressController = new AddressController($this, $this->objShippingAddress->Id, 'ShippingAddress: ', 'ShippingAddressController' ); $this->objBillingAddressController = new AddressController($this, $this->objBillingAddress->Id, 'BillingAddress: ', 'BillingAddressController' ); $this->objShippingAddressController->Visible = true; $this->objBillingAddressController->Visible = true; $this->objCheckOutItemListModule->Visible = true; */ } /** * This Function is called when any input is sent - on failure the * fields are redrawn with optional error messages. */ public function Validate(){ $blnToReturn = true; // validate input here return $blnToReturn; } public function __get($strName){ switch ($strName){ //Note: this (like all __get magic) returns a copy ..) case 'ItemListModule': return $this->objCheckOutItemListModule ; case 'ShoppingCart': return $this->objShoppingCart ; case 'ShippingAddress': return $this->objShippingAddress ; case 'BillingAddress': return $this->objBillingAddress ; case 'Account': return IndexPage::$objAccount ; case 'TotalItemsCharge': return $this->objCheckOutTotalsController->ShippingCharge ; case 'ShippingCharge': return $this->objCheckOutTotalsController->ShippingCharge ; case 'HandlingCharge': return $this->objCheckOutTotalsController->HandlingCharge ; default: try { return parent::__get($strName); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } } public function __set($strName, $mixValue){ switch ($strName){ case 'ShippingCharge': return ($this->objCheckOutTotalsController->ShippingCharge = $mixValue); case 'TotalItemsCharge': return ($this->objCheckOutTotalsController->TotalItemsCharge = $mixValue); default: try { return (parent::__set($strName, $mixValue)); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } } }//end class }//end define ?>