パスワードフィールドに値がある場合はチェックアウトレジスタ、それ以外の場合はゲストチェックアウト


7

チェックアウトの請求ステップで常にパスワードフィールドを表示したい。チェックアウトの最初のステップを削除しました。

この請求ステップでは、顧客がパスワードを入力するとアカウントが作成されるようにします。顧客が入力フィールドを空のままにした場合、ゲストとしてチェックアウトします。

billing.phtmlでは、現在、この行はパスワード入力フィールドの上にあります。

<?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 ?>

パスワードフィールドのデフォルトコードは次のとおりです。

        <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>

コントローラ:

<?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 ?>

チェックボックスが表示され、チェックされている場合は顧客が登録できます。オフのままにすると、お客様はゲストとしてチェックアウトします。それはうまくいきますが、チェックボックスなしで動作するように変更するにはどうすればよいですか?

これをどのように変更できますか?


靴コントローラコード..してください
アミットベラ

質問を編集します。
JGeer 2015

回答:


3

編集済み

まず、あなたはスキップする必要があるcheckout method saveneed to directly goes to課金ステップとそこwill you save checkout methodのようにguest/register依存しますyour logic of password

チェックアウトメソッドを保存するには2つの方法があります

  • Rewrite controller:
    • Using Observer

コントローラの書き換え:

請求ステップデータare using default magento onepagecontroller保存する場合は 、書き換えコントローラを追加します

<?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));
        }
    }


}

オブザーバーを使用して:

イベントcontroller_action_predispatch_checkout_onepage_saveBilling発生時にSaveするイベントを発生させますcheckout method

config.xmlコード:

<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>

オブザーバーコード:

その後、オブザーバーで 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);
    }
}

JavaScriptでguestデフォルトのチェックアウトメソッドとして設定してfor going to billing stepから使用するabove 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 ?>     

では、どのファイルをどのように変更する必要がありますか?
JGeer 2015

このコードをメソッドコントローラーに配置します。BILLIステップ値がsvaedされている場合
アミットベラ

@AmitBera:そのコントローラーにはクラス名がありますか?その場合は、質問に完全なクラス名を追加して、ここで何をするのかを明確にしてください。一見すると、これはコアファイルを編集しているように見えますか?
hakre 2015

課金データの保存にモジュールを使用しましたか
Amit Bera

いいえ、請求データの保存にモジュールを使用していません
JGeer 2015

1

これを行う最善の方法は、それがAmit Beraによって提案されているように、使用しているコントローラーである場合、onepagecontrollerをオーバーライドすることです。ただし、簡単な方法を使用する場合は、billing.phtmlファイル自体でこれを実現できます。このトリックは、チェックボックスと同じ名前のチェックボックスの代わりに非表示要素を使用することです。チェックボックスのonclickイベントの代わりに、パスワードフィールドのonblurイベントを使用して、それに応じてtoggleRegisterロジックを実行できます。これはあなたの目的を解決することを理解しています。

編集済み

以下のように、パスワードフィールドにonblurイベントを追加してください。

<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)" />

次に、フォーム内に次のような非表示要素を追加します。

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

次に、toggleRegister()メソッドを次のように置き換えます。

編集:

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();
        }
    }
}

ありがとう!このコードの例を教えていただけますか?それは私が成し遂げることができない部分だからです。
JGeer 2015

コードを試しましたが、うまくいきませんでした。すべてをコードに置き換えましたが、パスワードフィールド全体が表示されません。
JGeer 2015

参考のためにこのコードを投稿しました。コード全体を置き換えないでください。違いをマークして、コードを正確に更新してください。どうなるか教えてください。
Nasir Perwaiz、2015

編集した回答を見て、どうなるか教えてください。
Nasir Perwaiz、2015

編集ありがとうございます。<?php // SKIP STEP 1 START?>と<?php // SKIP STEP 1 END?>?の間のコード全体を削除する必要がありますか?そのコードを削除してコードを追加すると、フィールドがなくなってしまうからです。
JGeer 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.