/**
  * Validates that the state that the customer enters either
  * in the shipping form or billing form respects the format
  * for the countries we want to validate it upon.
  *
  * @param CModel $model
  * @param string $attribute
  * @return void
  */
 public function validateAttribute($model, $attribute)
 {
     switch ($attribute) {
         case 'shippingState':
             $objCountry = Country::Load($model->shippingCountry);
             break;
         case 'billingState':
             $objCountry = Country::Load($model->billingCountry);
             break;
         default:
             // Cannot validate any other attributes.
             return;
     }
     if ($objCountry === null) {
         // Country isn't valid, can't validate the state!
         return;
     }
     $countriesToValidateState = array(self::USA, self::CANADA, self::AUSTRALIA);
     if (in_array($objCountry->id, $countriesToValidateState) === false) {
         // Do not attempt to validate the state.
         return;
     }
     if (empty($model->{$attribute}) === true) {
         $this->addError($model, $attribute, Yii::t('yii', '{attributeName} cannot be blank.', array('{attributeName}' => $model->getattributeLabel($attribute))));
     } else {
         $objState = State::Load($model->{$attribute});
         if ($objState === null) {
             $this->addError($model, $attribute, Yii::t('yii', '{attributeName} is invalid.', array('{attributeName}' => $model->getattributeLabel($attribute))));
         }
     }
 }
 public function setBillingState($intState)
 {
     $objBillingState = State::Load($intState);
     if ($objBillingState !== null) {
         $this->billingStateCode = $objBillingState->code;
         $this->billingCountry = $objBillingState->country_id;
     }
 }
 /**
  * Set the cart tax code based on an address.
  * The country_id parameter is required, state_id and postal are optional.
  */
 public function actionSetTaxByAddress()
 {
     $intCountryId = Yii::app()->getRequest()->getParam('country_id');
     $intStateId = Yii::app()->getRequest()->getParam('state_id', '');
     $strPostal = Yii::app()->getRequest()->getParam('postal', '');
     $objCountry = Country::Load($intCountryId);
     if ($objCountry === null) {
         throw new CHttpException(400, Yii::t('application errors', 'Invalid country_id.'));
     }
     $strStateCode = null;
     if ($intStateId !== '') {
         $objState = State::Load($intStateId);
         if ($objState === null) {
             throw new CHttpException(400, Yii::t('application errors', 'Invalid state_id.'));
         }
         // Validate the state/country combination.
         $arrShippingStates = Country::getCountryShippingStates($intCountryId);
         if (array_key_exists($intStateId, $arrShippingStates) === false) {
             throw new CHttpException(400, Yii::t('application errors', 'The state_id is not valid for the country_id.'));
         }
         $strStateCode = $objState->code;
     }
     Yii::app()->shoppingcart->setTaxCodeByAddress($objCountry->code, $strStateCode, $strPostal);
     $arrReturn['cartitems'] = $this->renderPartial('/cart/_cartitems', null, true);
     if (Yii::app()->session->get('ship.prices.cache', null) !== null) {
         $arrReturn['action'] = 'triggerCalc';
     }
     return $this->renderJSON($arrReturn);
 }