Thanh toán đăng ký nếu trường mật khẩu có giá trị nếu không khách thanh toán


7

Tôi muốn hiển thị trường mật khẩu luôn trong bước thanh toán của thanh toán. Chúng tôi loại bỏ các bước nắm tay trong thanh toán.

Trong bước thanh toán này, chúng tôi muốn rằng nếu khách hàng nhập mật khẩu, họ sẽ tạo một tài khoản. Nếu khách hàng bỏ trống các trường đầu vào, nó sẽ thanh toán với tư cách là khách.

Trong billing.phtml tôi hiện có dòng này phía trên các trường nhập mật khẩu:

<?php if($this->helper('skipstep1')->isSkipEnabled() && $this->getQuote()->isAllowedGuestCheckout()): ?>
            <li class="fields">
            <div class="field">
                            <label class="account-aanmaken-checkout" for="login:register"><?php echo $this->__('Register with us for future convenience') ?></label>
                <div class="input-box checkout-account">
                <input type="checkbox" class="checkbox" name="login[register]" id="login:register" value="1" title="<?php echo $this->__('Register') ?>" onclick="toggleRegister(this)"<?php if (Mage::getStoreConfig('checkout/skipstep1/default_method')=='register'): ?> checked="checked"<?php endif ?>/>
                </div>
            </li>
            <?php endif ?>

Mã mặc định cho trường mật khẩu là đây:

        <li class="fields" id="register-customer-password">
            <div class="field">
                <label for="billing:customer_password" class="required"><em>*</em><?php echo $this->__('Password') ?></label>
                <div class="input-box">
                    <input type="password" name="billing[customer_password]" id="billing:customer_password" title="<?php echo $this->__('Password') ?>" class="input-text required-entry validate-password" />
                </div>
            </div>
            <div class="field">
                <label for="billing:confirm_password" class="required"><em>*</em><?php echo $this->__('Confirm Password') ?></label>
                <div class="input-box">
                    <input type="password" name="billing[confirm_password]" title="<?php echo $this->__('Confirm Password') ?>" id="billing:confirm_password" class="input-text required-entry validate-cpassword" />
                </div>
            </div>
        </li>

Điều khiển:

<?php if (Mage::helper('skipstep1')->isSkipEnabled()): ?>
<script type="text/javascript">
function toggleRegister(checkbox) {
    // If registration is checked, or the customer has no choice => register
    if (!checkbox || checkbox.checked) {
        checkout.method = 'register';
        new Ajax.Request(
            checkout.saveMethodUrl,
            {method: 'post', onFailure: checkout.ajaxFailure.bind(checkout), parameters: {method:'register'}}
        );
        Element.show('register-customer-password');
        if ($('remember-me-box')) {
            $('remember-me-box').show();
        }
    // If the customer has a choice, and chose not to register => checkout as guest
    } else {
        checkout.method = 'guest';
        new Ajax.Request(
            checkout.saveMethodUrl,
            {method: 'post', onFailure: checkout.ajaxFailure.bind(checkout), parameters: {method:'guest'}}
        );
        Element.hide('register-customer-password');
        if ($('remember-me-box')) {
            $('remember-me-box').hide();
        }
    }
}

function toggleLogin() {
    $('login-form').toggle();
    $('co-billing-form').toggle();
    $('billing-login-link').toggle();
    $('billing-guest-link').toggle();
}

<?php if (!Mage::getSingleton('customer/session')->isLoggedIn()): ?>
checkout.method = '<?php echo Mage::getStoreConfig('checkout/skipstep1/default_method') ?>';
checkout.gotoSection('billing');
toggleRegister($('login:register'));
<?php endif ?>
<?php if ($this->getMessagesBlock()->getMessageCollection()->count()): // Failed login => message => hide address form / show login ?>
toggleLogin();
<?php endif ?>
</script>
<?php endif ?>

Điều đó hiển thị một hộp kiểm, nếu được chọn, khách hàng có thể đăng ký. Nếu không được kiểm tra, khách hàng sẽ thanh toán với tư cách là khách. Điều đó hoạt động rất tốt, nhưng làm thế nào tôi có thể sửa đổi nó rằng nó sẽ hoạt động mà không có hộp kiểm.

Làm thế nào tôi có thể sửa đổi điều này?


vui lòng đánh dấu mã điều khiển ..
Amit Bera

Chỉnh sửa câu hỏi.
JGeer

Câu trả lời:


3

Đã chỉnh sửa

Trước tiên, bạn cần phải bỏ qua checkout method saveneed to directly goes tobước thanh toán và có will you save checkout methodnhư guest/registerphụ thuộc vào your logic of password.

Có hai cách để lưu phương thức thanh toán .

  • Rewrite controller:
    • Using Observer

Viết lại bộ điều khiển:

Nếu bạn are using default magento onepagecontrollerđể lưu dữ liệu bước thanh toán thì bạn thêm bộ điều khiển viết lại .

<?php
require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'OnepageController.php';
class Amit_Checkout_OnepageController extends Mage_Checkout_OnepageController
{
        public function saveBillingAction()
    {
        if ($this->_expireAjax()) {
            return;
        }
        if ($this->getRequest()->isPost()) {
//            $postData = $this->getRequest()->getPost('billing', array());
//            $data = $this->_filterPostData($postData);

        // put add my code here 
        $CheckoutMethod='guest';
        $PassData = $this->getRequest()->getPost('billing', array());

        if(isset($PassData['customer_password']) && ($PassData['customer_password']!='')):
            $customer_password=$PassData['customer_password'];
            $confirm_password='';
            if(isset($PassData['confirm_password']) && ($PassData['confirm_password']!='')):
            $confirm_password=$PassData['confirm_password'];
            endif;
            /* if passpword match */
            if($confirm_password==$customer_password){
            $CheckoutMethod='register'; 
            }
        endif;
          $this->getOnepage()->saveCheckoutMethod($CheckoutMethod);



            $data = $this->getRequest()->getPost('billing', array());
            $customerAddressId = $this->getRequest()->getPost('billing_address_id', false);

            if (isset($data['email'])) {
                $data['email'] = trim($data['email']);
            }
            $result = $this->getOnepage()->saveBilling($data, $customerAddressId);

            if (!isset($result['error'])) {
                /* check quote for virtual */
                if ($this->getOnepage()->getQuote()->isVirtual()) {
                    $result['goto_section'] = 'payment';
                    $result['update_section'] = array(
                        'name' => 'payment-method',
                        'html' => $this->_getPaymentMethodsHtml()
                    );
                } elseif (isset($data['use_for_shipping']) && $data['use_for_shipping'] == 1) {
                    $result['goto_section'] = 'shipping_method';
                    $result['update_section'] = array(
                        'name' => 'shipping-method',
                        'html' => $this->_getShippingMethodsHtml()
                    );

                    $result['allow_sections'] = array('shipping');
                    $result['duplicateBillingInfo'] = 'true';
                } else {
                    $result['goto_section'] = 'shipping';
                }
            }

            $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
        }
    }


}

Bằng cách sử dụng người quan sát:

Trên sự kiện controller_action_predispatch_checkout_onepage_saveBillingbắn một sự kiện sẽ tiết kiệm checkout method.

mã cấu hình:

<global>
    <models>
        <custommodule>
            <class>Amit_CustomModule_Model</class>
        </custommodule>
    </models>
</global>
<frontend>
<events>
<controller_action_predispatch_checkout_onepage_saveBilling>
    <observers>
        <captcha>
            <class>amit/observer</class>
            <method>AssignMethod</method>
        </captcha>
    </observers>
</controller_action_predispatch_checkout_onepage_saveBilling>
<events>
</frontend>

Mã quan sát viên:

Sau đó trên Observer save checkout method as guest/register

<?php
class Amit_CustomModule_Model_Observer{

    public function AssignMethod($observer){
    $CheckoutMethod='guest';
    // check customer is loggedin or not 
    if (!Mage::getSingleton('customer/session')->isLoggedIn()){
            $PassData = $this->getRequest()->getPost('billing', array());

            if(isset($PassData['customer_password']) && ($PassData['customer_password']!='')):
                $customer_password=$PassData['customer_password'];
                $confirm_password='';
                if(isset($PassData['confirm_password']) && ($PassData['confirm_password']!='')):
                $confirm_password=$PassData['confirm_password'];
                endif;
                /* if passpword match */
                if($confirm_password==$customer_password){
                $CheckoutMethod='register'; 
                }
            endif;
     }else{
        $CheckoutMethod='register';

     }
      Mage::getSingleton('checkout/type_onepage')->saveCheckoutMethod($CheckoutMethod);
    }
}

Trên JavaScript được đặt guestlàm phương thức thanh toán mặc định, for going to billing stepsau đó sử dụngabove two process change the checkout method basic of password field

<?php if (Mage::helper('skipstep1')->isSkipEnabled()): ?>
<script type="text/javascript">
function toggleRegister(checkbox) {


        checkout.method = 'guest';
        new Ajax.Request(
            checkout.saveMethodUrl,
            {method: 'post', onFailure: checkout.ajaxFailure.bind(checkout), parameters: {method:'register'}}
        );
        Element.show('register-customer-password');
        if ($('remember-me-box')) {
            $('remember-me-box').show();
        }
    // If the customer has a choice, and chose not to register => checkout as guest
}

function toggleLogin() {
    $('login-form').toggle();
    $('co-billing-form').toggle();
    $('billing-login-link').toggle();
    $('billing-guest-link').toggle();
}


checkout.gotoSection('billing');
toggleRegister($('login:register'));
<?php if ($this->getMessagesBlock()->getMessageCollection()->count()): // Failed login => message => hide address form / show login ?>
toggleLogin();
<?php endif ?>
</script>
<?php endif ?>     

Vậy tôi cần sửa đổi tập tin nào và chính xác như thế nào?
JGeer

Đặt mã này trên bộ điều khiển phương thức. Trường hợp giá trị bước Billi được svaed
Amit Bera

@AmitBera: Bộ điều khiển đó có tên lớp không? Nếu vậy, vui lòng thêm tên lớp đầy đủ vào câu hỏi của bạn để nó rõ ràng bạn muốn làm gì ở đây. Nhìn thoáng qua có vẻ như bạn đang chỉnh sửa các tệp lõi?
hakre

bạn đã sử dụng bất kỳ mô-đun nào để lưu dữ liệu thanh toán
Amit Bera

Không, chúng tôi không sử dụng bất kỳ mô-đun nào để lưu dữ liệu thanh toán
JGeer

1

Tôi muốn nói rằng phương pháp tốt nhất để làm điều này là bằng cách ghi đè bộ điều khiển onepagecontont nếu đó là bộ điều khiển bạn đang sử dụng theo đề xuất của Amit Bera. Nhưng nếu bạn muốn thực hiện một lộ trình dễ dàng, bạn có thể đạt được điều này trong chính tệp thanh toán. Thủ thuật này là sử dụng một yếu tố ẩn thay cho hộp kiểm có cùng tên với hộp kiểm. Thay vì sự kiện onclick của hộp kiểm, bạn có thể sử dụng sự kiện onblur của trường mật khẩu và thực hiện logic toggleRegister tương ứng. Tôi hiểu điều này sẽ giải quyết mục đích của bạn.

EDITED

Vui lòng thêm sự kiện onblur vào trường mật khẩu của bạn như dưới đây,

<input type="password" name="billing[customer_password]" id="billing:customer_password" title="<?php echo $this->__('Password') ?>" class="input-text required-entry validate-password" onblur="toggleRegister(this)" />

Bây giờ trong biểu mẫu của bạn thêm một yếu tố ẩn như thế này.

<input type="hidden" name="login[register]" id="login:register" value="0" />

Bây giờ thay thế phương thức toggleRegister () bằng cách sau

BIÊN TẬP:

function toggleRegister(ele) {
    //Please change the following line
    if($('billing:customer_password').value != ''){
        $('login_register').value = '1';
        checkout.method = 'register';
        new Ajax.Request(
            checkout.saveMethodUrl,
            {method: 'post', onFailure: checkout.ajaxFailure.bind(checkout), parameters: {method:'register'}}
        );
        Element.show('register-customer-password');
        if ($('remember-me-box')) {
            $('remember-me-box').show();
        }
    }else{
        $('login_register').value = '0';
        checkout.method = 'guest';
        new Ajax.Request(
            checkout.saveMethodUrl,
            {method: 'post', onFailure: checkout.ajaxFailure.bind(checkout), parameters: {method:'guest'}}
        );
        Element.hide('register-customer-password');
        if ($('remember-me-box')) {
            $('remember-me-box').hide();
        }
    }
}

Cảm ơn! Bạn có thể đưa ra một ví dụ về cách mã này sẽ trông như thế nào? Bởi vì đó là phần tôi không thể hoàn thành.
JGeer

Đã thử mã của bạn, nhưng điều đó không làm việc. Tôi đã thay thế mọi thứ bằng mã của bạn, nhưng sau đó toàn bộ các trường mật khẩu không được hiển thị.
JGeer

Tôi đăng mã này để bạn tham khảo. Vui lòng không thay thế toàn bộ mã. Vui lòng đánh dấu sự khác biệt và cập nhật mã của bạn một cách phù hợp. Hãy cho tôi biết những gì sẽ xảy ra.
Nasir Perwaiz

Xin vui lòng xem câu trả lời chỉnh sửa và cho tôi biết những gì xảy ra.
Nasir Perwaiz

Cảm ơn bạn đã chỉnh sửa. Tôi có cần xóa toàn bộ mã giữa dòng <? Php // SKIP BƯỚC 1 BẮT ĐẦU?> Và <? Php // SKIP BƯỚC 1 END?>?. Bởi vì khi tôi loại bỏ mã đó và tôi thêm mã của bạn, các trường sẽ biến mất.
JGeer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.