Bagisto Forum

    Bagisto

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    'checkout/onepage.blade.php' this page feel quite complicated for simple customization. Any suggestion to work around it.

    General Discussion
    2
    2
    421
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      prashant2408 last edited by

      There is lot of confusing vue code😕 .

      @extends('shop::layouts.master')
      @section('page_title')
          {{ __('shop::app.checkout.onepage.title') }}
      @stop
      @section('content-wrapper')
          <checkout></checkout>
      @endsection
      @push('scripts')
          @include('shop::checkout.cart.coupon')
          <script type="text/x-template" id="checkout-template">
              <div class="container">
                  <div id="checkout" class="checkout-process row offset-lg-1 col-lg-11 col-md-12">
                      <h1 class="col-12">{{ __('velocity::app.checkout.checkout') }}</h1>
                      <div class="col-lg-7 col-md-12">
                          <div class="step-content information" id="address-section">
                              @include('shop::checkout.onepage.customer-info')
                          </div>
      
                          <div
                              class="step-content shipping"
                              id="shipping-section"
                              v-if="showShippingSection">
      
                              <shipping-section @onShippingMethodSelected="shippingMethodSelected($event)">
                              </shipping-section>
                          </div>
      
                          <div
                              class="step-content payment"
                              v-if="showPaymentSection"
                              id="payment-section">
      
                              <payment-section @onPaymentMethodSelected="paymentMethodSelected($event)">
                              </payment-section>
      
                              <coupon-component
                                  @onApplyCoupon="getOrderSummary"
                                  @onRemoveCoupon="getOrderSummary">
                              </coupon-component>
                          </div>
      
                          <div
                              class="step-content review"
                              v-if="showSummarySection"
                              id="summary-section">
      
                              <review-section :key="reviewComponentKey">
                                  <div slot="summary-section">
                                      <summary-section
                                          discount="1"
                                          :key="summeryComponentKey"
                                          @onApplyCoupon="getOrderSummary"
                                          @onRemoveCoupon="getOrderSummary"
                                      ></summary-section>
                                  </div>
      
                                  <div slot="place-order-btn">
                                      <div class="mb20">
                                          <button
                                              type="button"
                                              class="theme-btn"
                                              @click="placeOrder()"
                                              :disabled="!isPlaceOrderEnabled"
                                              v-if="selected_payment_method.method != 'paypal_smart_button'"
                                              id="checkout-place-order-button">
                                              {{ __('shop::app.checkout.onepage.place-order') }}
                                          </button>
                                      </div>
                                  </div>
                              </review-section>
                          </div>
                      </div>
                      <div class="col-lg-4 col-md-12 offset-lg-1 order-summary-container top pt0">
                          <summary-section :key="summeryComponentKey"></summary-section>
      
                          <div class="paypal-button-container mt10"></div>
                      </div>
                  </div>
              </div>
          </script>
          <script type="text/javascript">
              (() => {
                  var reviewHtml = '';
                  var paymentHtml = '';
                  var summaryHtml = '';
                  var shippingHtml = '';
                  var paymentMethods = '';
                  var customerAddress = '';
                  var shippingMethods = '';
      
                  var reviewTemplateRenderFns = [];
                  var paymentTemplateRenderFns = [];
                  var summaryTemplateRenderFns = [];
                  var shippingTemplateRenderFns = [];
      
                  @auth('customer')
                      @if(auth('customer')->user()->addresses)
                          customerAddress = @json(auth('customer')->user()->addresses);
                          customerAddress.email = "{{ auth('customer')->user()->email }}";
                          customerAddress.first_name = "{{ auth('customer')->user()->first_name }}";
                          customerAddress.last_name = "{{ auth('customer')->user()->last_name }}";
                      @endif
                  @endauth
      
                  Vue.component('checkout', {
                      template: '#checkout-template',
                      inject: ['$validator'],
      
                      data: function () {
                          return {
                              allAddress: {},
                              current_step: 1,
                              completed_step: 0,
                              isCheckPayment: true,
                              is_customer_exist: 0,
                              disable_button: false,
                              reviewComponentKey: 0,
                              summeryComponentKey: 0,
                              showPaymentSection: false,
                              showSummarySection: false,
                              isPlaceOrderEnabled: false,
                              new_billing_address: false,
                              showShippingSection: false,
                              new_shipping_address: false,
                              selected_payment_method: '',
                              selected_shipping_method: '',
                              countries: [],
                              countryStates: [],
      
                              step_numbers: {
                                  'information': 1,
                                  'shipping': 2,
                                  'payment': 3,
                                  'review': 4
                              },
      
                              address: {
                                  billing: {
                                      address1: [''],
                                      save_as_address: false,
                                      use_for_shipping: true,
                                  },
      
                                  shipping: {
                                      address1: ['']
                                  },
                              },
                          }
                      },
      
                      created: function () {
                          this.fetchCountries();
      
                          this.fetchCountryStates();
      
                          this.getOrderSummary();
      
                          if (! customerAddress) {
                              this.new_shipping_address = true;
                              this.new_billing_address = true;
                          } else {
                              this.address.billing.first_name = this.address.shipping.first_name = customerAddress.first_name;
                              this.address.billing.last_name = this.address.shipping.last_name = customerAddress.last_name;
                              this.address.billing.email = this.address.shipping.email = customerAddress.email;
      
                              if (customerAddress.length < 1) {
                                  this.new_shipping_address = true;
                                  this.new_billing_address = true;
                              } else {
                                  this.allAddress = customerAddress;
      
                                  for (let country in this.countries) {
                                      for (let code in this.allAddress) {
                                          if (this.allAddress[code].country) {
                                              if (this.allAddress[code].country == this.countries[country].code) {
                                                  this.allAddress[code]['country'] = this.countries[country].name;
                                              }
                                          }
                                      }
                                  }
                              }
                          }
                      },
      
                      methods: {
                          navigateToStep: function (step) {
                              if (step <= this.completed_step) {
                                  this.current_step = step
                                  this.completed_step = step - 1;
                              }
                          },
      
                          fetchCountries: function () {
                              let countriesEndPoint = `${this.$root.baseUrl}/api/countries?pagination=0`;
      
                              this.$http.get(countriesEndPoint)
                                  .then(response => {
                                      this.countries = response.data.data;
                                  })
                                  .catch(function (error) {});
                          },
      
                          fetchCountryStates: function () {
                              let countryStateEndPoint = `${this.$root.baseUrl}/api/country-states?pagination=0`;
      
                              this.$http.get(countryStateEndPoint)
                                  .then(response => {
                                      this.countryStates = response.data.data;
                                  })
                                  .catch(function (error) {});
                          },
      
                          haveStates: function (addressType) {
                              if (this.countryStates[this.address[addressType].country] && this.countryStates[this.address[addressType].country].length)
                                  return true;
      
                              return false;
                          },
      
                          validateForm: async function (scope) {
                              var isManualValidationFail = false;
      
                              if (scope == 'address-form') {
                                  isManualValidationFail = this.validateAddressForm();
                              }
      
                              if (! isManualValidationFail) {
                                  await this.$validator.validateAll(scope)
                                  .then(result => {
                                      if (result) {
                                          switch (scope) {
                                              case 'address-form':
                                                  /* loader will activate only when save as address is clicked */
                                                  if (this.address.billing.save_as_address) {
                                                      this.$root.showLoader();
                                                  }
      
                                                  /* this is outside because save as address also calling for
                                                     saving the address in the order only */
                                                  this.saveAddress();
                                                  break;
      
                                              case 'shipping-form':
                                                  if (this.showShippingSection) {
                                                      this.$root.showLoader();
                                                      this.saveShipping();
                                                      break;
                                                  }
      
                                              case 'payment-form':
                                                  this.$root.showLoader();
                                                  this.savePayment();
      
                                                  this.isPlaceOrderEnabled = ! this.validateAddressForm();
                                                  break;
      
                                              default:
                                                  break;
                                          }
      
                                      } else {
                                          this.isPlaceOrderEnabled = false;
                                      }
                                  });
                              } else {
                                  this.isPlaceOrderEnabled = false;
                              }
                          },
      
                          validateAddressForm: function () {
                              var isManualValidationFail = false;
      
                              let form = $(document).find('form[data-vv-scope=address-form]');
      
                              // validate that if all the field contains some value
                              if (form) {
                                  form.find(':input').each((index, element) => {
                                      let value = $(element).val();
                                      let elementId = element.id;
      
                                      if (value == ""
                                          && element.id != 'sign-btn'
                                          && element.id != 'billing[company_name]'
                                          && element.id != 'shipping[company_name]'
                                      ) {
                                          // check for multiple line address
                                          if (elementId.match('billing_address_')
                                              || elementId.match('shipping_address_')
                                          ) {
                                              // only first line address is required
                                              if (elementId == 'billing_address_0'
                                                  || elementId == 'shipping_address_0'
                                              ) {
                                                  isManualValidationFail = true;
                                              }
                                          } else {
                                              isManualValidationFail = true;
                                          }
                                      }
                                  });
                              }
      
                              // validate that if customer wants to use different shipping address
                              if (! this.address.billing.use_for_shipping) {
                                  if (! this.address.shipping.address_id && ! this.new_shipping_address) {
                                      isManualValidationFail = true;
                                  }
                              }
      
                              return isManualValidationFail;
                          },
      
                          isCustomerExist: function() {
                              this.$validator.attach('address-form.billing[email]', 'required|email');
      
                              this.$validator.validate('address-form.billing[email]', this.address.billing.email)
                              .then(isValid => {
                                  if (! isValid)
                                      return;
      
                                  this.$http.post("{{ route('customer.checkout.exist') }}", {email: this.address.billing.email})
                                  .then(response => {
                                      this.is_customer_exist = response.data ? 1 : 0;
                                      console.log(this.is_customer_exist);
      
                                      if (response.data)
                                          this.$root.hideLoader();
                                  })
                                  .catch(function (error) {})
                              })
                              .catch(error => {})
                          },
      
                          loginCustomer: function () {
                              this.$http.post("{{ route('customer.checkout.login') }}", {
                                      email: this.address.billing.email,
                                      password: this.address.billing.password
                                  })
                                  .then(response => {
                                      if (response.data.success) {
                                          window.location.href = "{{ route('shop.checkout.onepage.index') }}";
                                      } else {
                                          window.showAlert(`alert-danger`, this.__('shop.general.alert.danger'), response.data.error);
                                      }
                                  })
                                  .catch(function (error) {})
                          },
      
                          getOrderSummary: function () {
                              this.$http.get("{{ route('shop.checkout.summary') }}")
                                  .then(response => {
                                      summaryHtml = Vue.compile(response.data.html)
      
                                      this.summeryComponentKey++;
                                      this.reviewComponentKey++;
                                  })
                                  .catch(function (error) {})
                          },
      
                          saveAddress: async function () {
                              this.disable_button = true;
      
                              if (this.allAddress.length > 0) {
                                  let address = this.allAddress.forEach(address => {
                                      if (address.id == this.address.billing.address_id) {
                                          this.address.billing.address1 = [address.address1];
      
                                          if (address.email) {
                                              this.address.billing.email = address.email;
                                          }
      
                                          if (address.first_name) {
                                              this.address.billing.first_name = address.first_name;
                                          }
      
                                          if (address.last_name) {
                                              this.address.billing.last_name = address.last_name;
                                          }
                                      }
      
                                      if (address.id == this.address.shipping.address_id) {
                                          this.address.shipping.address1 = [address.address1];
      
                                          if (address.email) {
                                              this.address.shipping.email = address.email;
                                          }
      
                                          if (address.first_name) {
                                              this.address.shipping.first_name = address.first_name;
                                          }
      
                                          if (address.last_name) {
                                              this.address.shipping.last_name = address.last_name;
                                          }
                                      }
                                  });
                              }
      
                              this.$http.post("{{ route('shop.checkout.save-address') }}", this.address)
                                  .then(response => {
                                      this.disable_button = false;
                                      this.isPlaceOrderEnabled = true;
      
                                      if (this.step_numbers[response.data.jump_to_section] == 2) {
                                          this.showShippingSection = true;
                                          shippingHtml = Vue.compile(response.data.html);
                                      } else {
                                          paymentHtml = Vue.compile(response.data.html)
                                      }
      
                                      this.completed_step = this.step_numbers[response.data.jump_to_section] + 1;
                                      this.current_step = this.step_numbers[response.data.jump_to_section];
      
                                      if (response.data.jump_to_section == "payment") {
                                          this.showPaymentSection = true;
                                          paymentMethods  = response.data.paymentMethods;
                                      }
      
                                      shippingMethods = response.data.shippingMethods;
      
                                      this.getOrderSummary();
      
                                      this.$root.hideLoader();
                                  })
                                  .catch(error => {
                                      this.disable_button = false;
                                      this.$root.hideLoader();
      
                                      this.handleErrorResponse(error.response, 'address-form')
                                  })
                          },
      
                          saveShipping: async function () {
                              this.disable_button = true;
      
                              this.$http.post("{{ route('shop.checkout.save-shipping') }}", {'shipping_method': this.selected_shipping_method})
                                  .then(response => {
                                      this.$root.hideLoader();
                                      this.disable_button = false;
                                      this.showPaymentSection = true;
      
                                      paymentHtml = Vue.compile(response.data.html)
      
                                      this.completed_step = this.step_numbers[response.data.jump_to_section] + 1;
      
                                      this.current_step = this.step_numbers[response.data.jump_to_section];
      
                                      paymentMethods = response.data.paymentMethods;
      
                                      if (this.selected_payment_method) {
                                          this.savePayment();
                                      }
      
                                      this.getOrderSummary();
                                  })
                                  .catch(error => {
                                      this.disable_button = false;
                                      this.$root.hideLoader();
                                      this.handleErrorResponse(error.response, 'shipping-form')
                                  })
                          },
      
                          savePayment: async function () {
                              this.disable_button = true;
      
                              if (this.isCheckPayment) {
                                  this.isCheckPayment = false;
      
                                  this.$http.post("{{ route('shop.checkout.save-payment') }}", {'payment': this.selected_payment_method})
                                  .then(response => {
                                      this.isCheckPayment = true;
                                      this.disable_button = false;
      
                                      this.showSummarySection = true;
                                      this.$root.hideLoader();
      
                                      reviewHtml = Vue.compile(response.data.html)
                                      this.completed_step = this.step_numbers[response.data.jump_to_section] + 1;
                                      this.current_step = this.step_numbers[response.data.jump_to_section];
      
                                      document.body.style.cursor = 'auto';
      
                                      this.getOrderSummary();
                                  })
                                  .catch(error => {
                                      this.disable_button = false;
                                      this.$root.hideLoader();
                                      this.handleErrorResponse(error.response, 'payment-form')
                                  });
                              }
                          },
      
                          placeOrder: async function () {
                              if (this.isPlaceOrderEnabled) {
                                  this.disable_button = false;
                                  this.isPlaceOrderEnabled = false;
      
                                  this.$root.showLoader();
      
                                  this.$http.post("{{ route('shop.checkout.save-order') }}", {'_token': "{{ csrf_token() }}"})
                                  .then(response => {
                                      if (response.data.success) {
                                          if (response.data.redirect_url) {
                                              this.$root.hideLoader();
                                              window.location.href = response.data.redirect_url;
                                          } else {
                                              this.$root.hideLoader();
                                              window.location.href = "{{ route('shop.checkout.success') }}";
                                          }
                                      }
                                  })
                                  .catch(error => {
                                      this.disable_button = true;
                                      this.$root.hideLoader();
      
                                      window.showAlert(`alert-danger`, this.__('shop.general.alert.danger'), "{{ __('shop::app.common.error') }}");
                                  })
                              } else {
                                  this.disable_button = true;
                              }
                          },
      
                          handleErrorResponse: function (response, scope) {
                              if (response.status == 422) {
                                  serverErrors = response.data.errors;
                                  this.$root.addServerErrors(scope)
                              } else if (response.status == 403) {
                                  if (response.data.redirect_url) {
                                      window.location.href = response.data.redirect_url;
                                  }
                              }
                          },
      
                          shippingMethodSelected: function (shippingMethod) {
                              this.selected_shipping_method = shippingMethod;
                          },
      
                          paymentMethodSelected: function (paymentMethod) {
                              this.selected_payment_method = paymentMethod;
                          },
      
                          newBillingAddress: function () {
                              this.new_billing_address = true;
                              this.isPlaceOrderEnabled = false;
                              this.address.billing.address_id = null;
                          },
      
                          newShippingAddress: function () {
                              this.new_shipping_address = true;
                              this.isPlaceOrderEnabled = false;
                              this.address.shipping.address_id = null;
                          },
      
                          backToSavedBillingAddress: function () {
                              this.new_billing_address = false;
                              this.validateFormAfterAction()
                          },
      
                          backToSavedShippingAddress: function () {
                              this.new_shipping_address = false;
                              this.validateFormAfterAction()
                          },
      
                          validateFormAfterAction: function () {
                              setTimeout(() => {
                                  this.validateForm('address-form');
                              }, 0);
                          }
                      }
                  });
      
                  Vue.component('shipping-section', {
                      inject: ['$validator'],
      
                      data: function () {
                          return {
                              templateRender: null,
      
                              selected_shipping_method: '',
      
                              first_iteration : true,
                          }
                      },
      
                      staticRenderFns: shippingTemplateRenderFns,
      
                      mounted: function () {
                          this.templateRender = shippingHtml.render;
      
                          for (var i in shippingHtml.staticRenderFns) {
                              shippingTemplateRenderFns.push(shippingHtml.staticRenderFns[i]);
                          }
      
                          eventBus.$emit('after-checkout-shipping-section-added');
                      },
      
                      render: function (h) {
                          return h('div', [
                              (this.templateRender ?
                                  this.templateRender() :
                                  '')
                              ]);
                      },
      
                      methods: {
                          methodSelected: function () {
                              this.$parent.validateForm('shipping-form');
      
                              this.$emit('onShippingMethodSelected', this.selected_shipping_method)
      
                              eventBus.$emit('after-shipping-method-selected', this.selected_shipping_method);
                          }
                      }
                  })
      
                  Vue.component('payment-section', {
                      inject: ['$validator'],
      
                      data: function () {
                          return {
                              templateRender: null,
      
                              payment: {
                                  method: ""
                              },
      
                              first_iteration : true,
                          }
                      },
      
                      staticRenderFns: paymentTemplateRenderFns,
      
                      mounted: function () {
                          this.templateRender = paymentHtml.render;
      
                          for (var i in paymentHtml.staticRenderFns) {
                              paymentTemplateRenderFns.push(paymentHtml.staticRenderFns[i]);
                          }
      
                          eventBus.$emit('after-checkout-payment-section-added');
                      },
      
                      render: function (h) {
                          return h('div', [
                              (this.templateRender ?
                                  this.templateRender() :
                                  '')
                              ]);
                      },
      
                      methods: {
                          methodSelected: function () {
                              this.$parent.validateForm('payment-form');
      
                              this.$emit('onPaymentMethodSelected', this.payment)
      
                              eventBus.$emit('after-payment-method-selected', this.payment);
                          }
                      }
                  })
      
                  Vue.component('review-section', {
                      data: function () {
                          return {
                              error_message: '',
                              templateRender: null,
                          }
                      },
      
                      staticRenderFns: reviewTemplateRenderFns,
      
                      render: function (h) {
                          return h(
                              'div', [
                                  this.templateRender ? this.templateRender() : ''
                              ]
                          );
                      },
      
                      mounted: function () {
                          this.templateRender = reviewHtml.render;
      
                          for (var i in reviewHtml.staticRenderFns) {
                              reviewTemplateRenderFns[i] = reviewHtml.staticRenderFns[i];
                          }
      
                          this.$forceUpdate();
                      }
                  });
      
                  Vue.component('summary-section', {
                      inject: ['$validator'],
      
                      staticRenderFns: summaryTemplateRenderFns,
      
                      props: {
                          discount: {
                              default: 0,
                              type: [String, Number],
                          }
                      },
      
                      data: function () {
                          return {
                              changeCount: 0,
                              coupon_code: null,
                              error_message: null,
                              templateRender: null,
                              couponChanged: false,
                          }
                      },
      
                      mounted: function () {
                          this.templateRender = summaryHtml.render;
      
                          for (var i in summaryHtml.staticRenderFns) {
                              summaryTemplateRenderFns[i] = summaryHtml.staticRenderFns[i];
                          }
      
                          this.$forceUpdate();
                      },
      
                      render: function (h) {
                          return h('div', [
                              (this.templateRender ?
                                  this.templateRender() :
                                  '')
                              ]);
                      },
      
                      methods: {
                          onSubmit: function () {
                              var this_this = this;
                              const emptyCouponErrorText = "Please enter a coupon code";
                          },
      
                          changeCoupon: function () {
                              if (this.couponChanged == true && this.changeCount == 0) {
                                  this.changeCount++;
      
                                  this.error_message = null;
      
                                  this.couponChanged = false;
                              } else {
                                  this.changeCount = 0;
                              }
                          },
                      }
                  });
      
              })()
          </script>
      
      @endpush
      
      1 Reply Last reply Reply Quote 0
      • sanjay-webkul
        sanjay-webkul last edited by sanjay-webkul

        Hi @prashant2408
        Cal you please elaborate?
        What exactly you want to do ?

        1 Reply Last reply Reply Quote 0
        • First post
          Last post