@@ -527,6 +527,30 @@ private function _getCart(bool $forceSave = false): Order
527527 private function _setAddresses (): void
528528 {
529529 $ currentUser = Craft::$ app ->getUser ()->getIdentity ();
530+
531+ $ setShippingAddress = true ;
532+ if ($ this ->request ->getParam ('clearShippingAddress ' ) !== null ) {
533+ $ this ->_cart ->setShippingAddress (null );
534+ $ this ->_cart ->sourceShippingAddressId = null ;
535+ $ setShippingAddress = false ;
536+ }
537+
538+ $ setBillingAddress = true ;
539+ if ($ this ->request ->getParam ('clearBillingAddress ' ) !== null ) {
540+ $ this ->_cart ->setBillingAddress (null );
541+ $ this ->_cart ->sourceBillingAddressId = null ;
542+ $ setBillingAddress = false ;
543+ }
544+
545+ if ($ this ->request ->getParam ('clearAddresses ' ) !== null ) {
546+ $ this ->_cart ->setShippingAddress (null );
547+ $ this ->_cart ->sourceShippingAddressId = null ;
548+ $ this ->_cart ->setBillingAddress (null );
549+ $ this ->_cart ->sourceBillingAddressId = null ;
550+ $ setBillingAddress = false ;
551+ $ setShippingAddress = false ;
552+ }
553+
530554 // Copy address options
531555 $ shippingIsBilling = $ this ->request ->getParam ('shippingAddressSameAsBilling ' );
532556 $ billingIsShipping = $ this ->request ->getParam ('billingAddressSameAsShipping ' );
@@ -541,68 +565,72 @@ private function _setAddresses(): void
541565 $ shippingAddressId = $ this ->request ->getParam ('shippingAddressId ' );
542566 $ billingAddressId = $ this ->request ->getParam ('billingAddressId ' );
543567
544- // Shipping address
545- if ($ shippingAddressId && !$ shippingIsBilling ) {
546- /** @var Address|null $userShippingAddress */
547- $ userShippingAddress = Collection::make ($ currentUser ->getAddresses ())->firstWhere ('id ' , $ shippingAddressId );
568+ if ($ setShippingAddress ) {
569+ // Shipping address
570+ if ($ shippingAddressId && !$ shippingIsBilling ) {
571+ /** @var Address|null $userShippingAddress */
572+ $ userShippingAddress = Collection::make ($ currentUser ->getAddresses ())->firstWhere ('id ' , $ shippingAddressId );
548573
549- // If a user's address ID has been submitted duplicate the address to the order
550- if ($ userShippingAddress ) {
551- $ this ->_cart ->sourceShippingAddressId = $ shippingAddressId ;
574+ // If a user's address ID has been submitted duplicate the address to the order
575+ if ($ userShippingAddress ) {
576+ $ this ->_cart ->sourceShippingAddressId = $ shippingAddressId ;
552577
553- /** @var Address $cartShippingAddress */
554- $ cartShippingAddress = Craft::$ app ->getElements ()->duplicateElement ($ userShippingAddress , ['ownerId ' => $ this ->_cart ->id ]);
555- $ this ->_cart ->setShippingAddress ($ cartShippingAddress );
578+ /** @var Address $cartShippingAddress */
579+ $ cartShippingAddress = Craft::$ app ->getElements ()->duplicateElement ($ userShippingAddress , ['ownerId ' => $ this ->_cart ->id ]);
580+ $ this ->_cart ->setShippingAddress ($ cartShippingAddress );
556581
557- if ($ billingIsShipping ) {
558- $ this ->_cart ->sourceBillingAddressId = $ userShippingAddress ->id ;
559- $ this ->_cart ->setBillingAddress ($ cartShippingAddress );
582+ if ($ billingIsShipping ) {
583+ $ this ->_cart ->sourceBillingAddressId = $ userShippingAddress ->id ;
584+ $ this ->_cart ->setBillingAddress ($ cartShippingAddress );
585+ }
560586 }
561- }
562- } elseif ($ shippingAddress && !$ shippingIsBilling ) {
563- $ this ->_cart ->sourceShippingAddressId = null ;
564- $ this ->_cart ->setShippingAddress ($ shippingAddress );
587+ } elseif ($ shippingAddress && !$ shippingIsBilling ) {
588+ $ this ->_cart ->sourceShippingAddressId = null ;
589+ $ this ->_cart ->setShippingAddress ($ shippingAddress );
565590
566- if (!empty ($ shippingAddress ['fields ' ]) && $ this ->_cart ->getShippingAddress ()) {
567- $ this ->_cart ->getShippingAddress ()->setFieldValues ($ shippingAddress ['fields ' ]);
568- }
591+ if (!empty ($ shippingAddress ['fields ' ]) && $ this ->_cart ->getShippingAddress ()) {
592+ $ this ->_cart ->getShippingAddress ()->setFieldValues ($ shippingAddress ['fields ' ]);
593+ }
569594
570- if ($ billingIsShipping ) {
571- $ this ->_cart ->sourceBillingAddressId = null ;
572- $ this ->_cart ->setBillingAddress ($ this ->_cart ->getShippingAddress ());
595+ if ($ billingIsShipping ) {
596+ $ this ->_cart ->sourceBillingAddressId = null ;
597+ $ this ->_cart ->setBillingAddress ($ this ->_cart ->getShippingAddress ());
598+ }
573599 }
574600 }
575601
576602 // Billing address
577- if ($ billingAddressId && !$ billingIsShipping ) {
578- /** @var Address|null $userBillingAddress */
579- $ userBillingAddress = Collection::make ($ currentUser ->getAddresses ())->firstWhere ('id ' , $ billingAddressId );
580-
581- // If a user's address ID has been submitted duplicate the address to the order
582- if ($ userBillingAddress ) {
583- $ this ->_cart ->sourceBillingAddressId = $ billingAddressId ;
603+ if ($ setBillingAddress ) {
604+ if ($ billingAddressId && !$ billingIsShipping ) {
605+ /** @var Address|null $userBillingAddress */
606+ $ userBillingAddress = Collection::make ($ currentUser ->getAddresses ())->firstWhere ('id ' , $ billingAddressId );
607+
608+ // If a user's address ID has been submitted duplicate the address to the order
609+ if ($ userBillingAddress ) {
610+ $ this ->_cart ->sourceBillingAddressId = $ billingAddressId ;
611+
612+ /** @var Address $cartBillingAddress */
613+ $ cartBillingAddress = Craft::$ app ->getElements ()->duplicateElement ($ userBillingAddress , ['ownerId ' => $ this ->_cart ->id ]);
614+ $ this ->_cart ->setBillingAddress ($ cartBillingAddress );
615+
616+ if ($ shippingIsBilling ) {
617+ $ this ->_cart ->sourceShippingAddressId = $ userBillingAddress ->id ;
618+ $ this ->_cart ->setShippingAddress ($ cartBillingAddress );
619+ }
620+ }
621+ } elseif ($ billingAddress && !$ billingIsShipping ) {
622+ $ this ->_cart ->sourceBillingAddressId = null ;
623+ $ this ->_cart ->setBillingAddress ($ billingAddress );
584624
585- /** @var Address $cartBillingAddress */
586- $ cartBillingAddress = Craft:: $ app -> getElements ()->duplicateElement ( $ userBillingAddress , [ ' ownerId ' => $ this -> _cart -> id ]);
587- $ this -> _cart -> setBillingAddress ( $ cartBillingAddress );
625+ if (! empty ( $ billingAddress [ ' fields ' ]) && $ this -> _cart -> getBillingAddress ()) {
626+ $ this -> _cart -> getBillingAddress ()->setFieldValues ( $ billingAddress [ ' fields ' ]);
627+ }
588628
589629 if ($ shippingIsBilling ) {
590- $ this ->_cart ->sourceShippingAddressId = $ userBillingAddress -> id ;
591- $ this ->_cart ->setShippingAddress ($ cartBillingAddress );
630+ $ this ->_cart ->sourceShippingAddressId = null ;
631+ $ this ->_cart ->setShippingAddress ($ this -> _cart -> getBillingAddress () );
592632 }
593633 }
594- } elseif ($ billingAddress && !$ billingIsShipping ) {
595- $ this ->_cart ->sourceBillingAddressId = null ;
596- $ this ->_cart ->setBillingAddress ($ billingAddress );
597-
598- if (!empty ($ billingAddress ['fields ' ]) && $ this ->_cart ->getBillingAddress ()) {
599- $ this ->_cart ->getBillingAddress ()->setFieldValues ($ billingAddress ['fields ' ]);
600- }
601-
602- if ($ shippingIsBilling ) {
603- $ this ->_cart ->sourceShippingAddressId = null ;
604- $ this ->_cart ->setShippingAddress ($ this ->_cart ->getBillingAddress ());
605- }
606634 }
607635
608636 // Estimated Shipping Address
@@ -629,17 +657,21 @@ private function _setAddresses(): void
629657 $ this ->_cart ->setEstimatedBillingAddress ($ estimatedBillingAddress );
630658 }
631659
660+
632661 $ this ->_cart ->billingSameAsShipping = (bool )$ billingIsShipping ;
633662 $ this ->_cart ->shippingSameAsBilling = (bool )$ shippingIsBilling ;
634663 $ this ->_cart ->estimatedBillingSameAsShipping = (bool )$ estimatedBillingIsShipping ;
635664
636665 // Set primary addresses
637- if ($ this ->request ->getBodyParam ('makePrimaryShippingAddress ' )) {
638- $ this ->_cart ->makePrimaryShippingAddress = true ;
666+ if ($ setShippingAddress ) {
667+ if ($ this ->request ->getBodyParam ('makePrimaryShippingAddress ' )) {
668+ $ this ->_cart ->makePrimaryShippingAddress = true ;
669+ }
639670 }
640-
641- if ($ this ->request ->getBodyParam ('makePrimaryBillingAddress ' )) {
642- $ this ->_cart ->makePrimaryBillingAddress = true ;
671+ if ($ setBillingAddress ) {
672+ if ($ this ->request ->getBodyParam ('makePrimaryBillingAddress ' )) {
673+ $ this ->_cart ->makePrimaryBillingAddress = true ;
674+ }
643675 }
644676 }
645677}
0 commit comments