2017-03-16 106 views
2

試圖在下面的Magento 2 JavaScript類(cc-form.js)中設置creditCardExpMonth到當前月份。月份值選項是1-12。當我手動添加月份值3 creditCardExpMonth:3,到默認值:{}時,它按預期工作。我似乎無法弄清楚如何動態地將其設置爲當前月份。我願意接受任何允許用戶選擇重寫值的解決方案,但我更喜歡將它放在此類或html頁面中,而不是頁面加載後的JQuery更新。JavaScript類:動態默認值

我在這個類中創建了一個getCurrentMonth()函數,但無法弄清楚如何正確訪問它以將creditCardExpMonth設置爲默認值。

define(
[ 
    'underscore', 
    'Mageplaza_Osc/js/view/payment/default', 
    'Magento_Payment/js/model/credit-card-validation/credit-card-data', 
    'Magento_Payment/js/model/credit-card-validation/credit-card-number-validator', 
    'mage/translate' 
], 
function (_, Component, creditCardData, cardNumberValidator, $t) { 
    return Component.extend({ 
     defaults: { 
      creditCardType: '', 
      creditCardExpYear: '', 
      creditCardExpMonth: '', 
      creditCardNumber: '', 
      creditCardSsStartMonth: '', 
      creditCardSsStartYear: '', 
      creditCardVerificationNumber: '', 
      selectedCardType: null 
     }, 

     initObservable: function() { 
      this._super() 
       .observe([ 
        'creditCardType', 
        'creditCardExpYear', 
        'creditCardExpMonth', 
        'creditCardNumber', 
        'creditCardVerificationNumber', 
        'creditCardSsStartMonth', 
        'creditCardSsStartYear', 
        'selectedCardType' 
       ]); 
      return this; 
     }, 

     initialize: function() { 
      var self = this; 
      this._super(); 


      //Set credit card number to credit card data object 
      this.creditCardNumber.subscribe(function(value) { 
       var result; 
       self.selectedCardType(null); 

       if (value == '' || value == null) { 
        return false; 
       } 
       result = cardNumberValidator(value); 

       if (!result.isPotentiallyValid && !result.isValid) { 
        return false; 
       } 
       if (result.card !== null) { 
        self.selectedCardType(result.card.type); 
        creditCardData.creditCard = result.card; 
       } 

       if (result.isValid) { 
        creditCardData.creditCardNumber = value; 
        self.creditCardType(result.card.type); 
       } 
      }); 

      //Set expiration year to credit card data object 
      this.creditCardExpYear.subscribe(function(value) { 
       creditCardData.expirationYear = value; 
      }); 

      //Set expiration month to credit card data object 
      this.creditCardExpMonth.subscribe(function(value) { 
       creditCardData.expirationYear = value; 
      }); 

      //Set cvv code to credit card data object 
      this.creditCardVerificationNumber.subscribe(function(value) { 
       creditCardData.cvvCode = value; 
      }); 
     }, 

     getCode: function() { 
      return 'cc'; 
     }, 
     getData: function() { 
      return { 
       'method': this.item.method, 
       'additional_data': { 
        'cc_cid': this.creditCardVerificationNumber(), 
        'cc_ss_start_month': this.creditCardSsStartMonth(), 
        'cc_ss_start_year': this.creditCardSsStartYear(), 
        'cc_type': this.creditCardType(), 
        'cc_exp_year': this.creditCardExpYear(), 
        'cc_exp_month': this.creditCardExpMonth(), 
        'cc_number': this.creditCardNumber() 
       } 
      }; 
     }, 
     getCcAvailableTypes: function() { 
      return window.checkoutConfig.payment.ccform.availableTypes[this.getCode()]; 
     }, 
     getIcons: function (type) { 
      return window.checkoutConfig.payment.ccform.icons.hasOwnProperty(type) 
       ? window.checkoutConfig.payment.ccform.icons[type] 
       : false 
     }, 
     getCcMonths: function() { 
      return window.checkoutConfig.payment.ccform.months[this.getCode()]; 
     }, 
     getCcYears: function() { 
      return window.checkoutConfig.payment.ccform.years[this.getCode()]; 
     }, 
     hasVerification: function() { 
      return window.checkoutConfig.payment.ccform.hasVerification[this.getCode()]; 
     }, 
     hasSsCardType: function() { 
      return window.checkoutConfig.payment.ccform.hasSsCardType[this.getCode()]; 
     }, 
     getCvvImageUrl: function() { 
      return window.checkoutConfig.payment.ccform.cvvImageUrl[this.getCode()]; 
     }, 
     getCvvImageHtml: function() { 
      return '<img src="' + this.getCvvImageUrl() 
       + '" alt="' + $t('Card Verification Number Visual Reference') 
       + '" title="' + $t('Card Verification Number Visual Reference') 
       + '" />'; 
     }, 
     getSsStartYears: function() { 
      return window.checkoutConfig.payment.ccform.ssStartYears[this.getCode()]; 
     }, 
     getCcAvailableTypesValues: function() { 
      return _.map(this.getCcAvailableTypes(), function(value, key) { 
       return { 
        'value': key, 
        'type': value 
       } 
      }); 
     }, 
     getCcMonthsValues: function() { 
      return _.map(this.getCcMonths(), function(value, key) { 
       return { 
        'value': key, 
        'month': value.substring(0,2) 
       } 
      }); 
     }, 
     getCcYearsValues: function() { 
      return _.map(this.getCcYears(), function(value, key) { 
       return { 
        'value': key, 
        'year': value 
       } 
      }); 
     }, 
     getCurrentMonth: function() { 
      var d = new Date(); 
      var n = d.getMonth() + 1; 
      return n; 
     }, 
     getCurrentYear: function() { 
      var d = new Date(); 
      var n = d.getYear(); 
      return n; 
     }, 
     getSsStartYearsValues: function() { 
      return _.map(this.getSsStartYears(), function(value, key) { 
       return { 
        'value': key, 
        'year': value 
       } 
      }); 
     }, 
     isShowLegend: function() { 
      return false; 
     }, 
     getCcTypeTitleByCode: function(code) { 
      var title = ''; 
      _.each(this.getCcAvailableTypesValues(), function (value) { 
       if (value['value'] == code) { 
        title = value['type']; 
       } 
      }); 
      return title; 
     }, 
     formatDisplayCcNumber: function(number) { 
      return 'xxxx-' + number.substr(-4); 
     }, 
     getInfo: function() { 
      return [ 
       {'name': 'Credit Card Type', value: this.getCcTypeTitleByCode(this.creditCardType())}, 
       {'name': 'Credit Card Number', value: this.formatDisplayCcNumber(this.creditCardNumber())} 
      ]; 
     } 
    }); 
}); 

這裏是淘汰賽HTML與選擇數據綁定以防萬一它的需要(從Magento的付款CC-form.html拍攝):

<select name="payment[cc_exp_month]" 
          class="select select-month" 
          data-bind="attr: {id: getCode() + '_expiration', 'data-container': getCode() + '-cc-month', 'data-validate': JSON.stringify({required:true, 'validate-cc-exp':'#' + getCode() + '_expiration_yr'})}, 
             enable: isActive($parents), 
             options: getCcMonthsValues(), 
             optionsValue: 'value', 
             optionsText: 'month', 
             optionsCaption: $t('Month'), 
             value: creditCardExpMonth"> 
        </select> 

回答

0

如果這個腳本的運行每次頁面負荷,你可以做這樣的事情:

defaults: { 
      creditCardType: '', 
      creditCardExpYear: '', 
      creditCardExpMonth: (function(){ 
            return ((new Date()).getMonth()+1); 
           })(), 
      creditCardNumber: '', 
      creditCardSsStartMonth: '', 
      creditCardSsStartYear: '', 
      creditCardVerificationNumber: '', 
      selectedCardType: null 
     } 

,或者如果你想要的東西更清潔,你可以重構代碼到被在此之前創建對象定義的函數:

function (_, Component, creditCardData, cardNumberValidator, $t) { 
    function getCurrentMonth() { 
     return ((new Date()).getMonth()+1); 
    } 
    return Component.extend({ 
     defaults: { 
      creditCardType: '', 
      creditCardExpYear: '', 
      creditCardExpMonth: getCurrentMonth(), 
      creditCardNumber: '', 
      creditCardSsStartMonth: '', 
      creditCardSsStartYear: '', 
      creditCardVerificationNumber: '', 
      selectedCardType: null 
     }, 
+1

完美,謝謝! – Jason