Kasse registrieren, wenn das Passwortfeld einen Wert hat, andernfalls Gastkasse

7

Ich möchte das Passwortfeld immer im Abrechnungsschritt der Kasse anzeigen. Wir haben den ersten Schritt an der Kasse entfernt.

In diesem Abrechnungsschritt möchten wir, dass ein Kunde, der ein Passwort eingibt, ein Konto erstellt. Wenn der Kunde die Eingabefelder leer lässt, wird er als Gast ausgecheckt.

In billing.phtml habe ich derzeit diese Zeile über den Passworteingabefeldern:

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

Der Standardcode für das Kennwortfeld lautet:

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

Regler:

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

Das zeigt ein Kontrollkästchen an, wenn aktiviert, kann sich der Kunde registrieren. Wenn Sie das Kontrollkästchen nicht aktivieren, wird der Kunde als Gast auschecken. Das funktioniert gut, aber wie kann ich ändern, dass es ohne das Kontrollkästchen funktioniert.

Wie kann ich das ändern?

JGeer
quelle
Bitte beschuhen Sie den Controller-Code ..
Amit Bera
Bearbeiten Sie die Frage.
JGeer

Antworten:

3

Bearbeitet

Zuerst müssen Sie überspringen checkout method saveund need to directly goes toAbrechnungsschritte und dort will you save checkout methodals guest/registerdavon abhängen your logic of password.

Es gibt zwei Möglichkeiten, die Checkout-Methode zu speichern .

  • Rewrite controller:
    • Using Observer

Controller umschreiben:

Wenn Sie are using default magento onepagecontrollerfür Schritt Daten speichern Abrechnung dann fügen Sie Rewrite - Controller .

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


}

Mit dem Beobachter:

Bei controller_action_predispatch_checkout_onepage_saveBillingeinem Ereignis wird ein Ereignis ausgelöst, das gespeichert wird checkout method.

config.xml Code:

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

Beobachtercode:

Dann auf 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);
    }
}

Auf JavaScript guestals Standard-Checkout-Methode festlegen und for going to billing stepdann verwendenabove 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 ?>     
Amit Bera
quelle
Welche Datei muss ich wie genau ändern?
JGeer
Setzen Sie diesen Code auf den Methodencontroller. Wo Billi Schritt Wert svaed ist
Amit Bera
@AmitBera: Hat dieser Controller einen Klassennamen? Wenn ja, fügen Sie Ihrer Frage bitte den vollständigen Klassennamen hinzu, damit klar ist, was Sie hier tun möchten. Auf den ersten Blick sieht es so aus, als würden Sie Core-Dateien bearbeiten?
hakre
Haben Sie ein Modul zum Speichern von Rechnungsdaten verwendet?
Amit Bera
Nein, wir verwenden kein Modul zum Speichern von Rechnungsdaten
JGeer
1

Ich würde sagen, die beste Methode, dies zu tun, besteht darin, den Onepage-Controller zu überschreiben, wenn es sich um den Controller handelt, den Sie verwenden, wie von Amit Bera vorgeschlagen. Wenn Sie jedoch einen einfachen Weg einschlagen möchten, können Sie dies in der Datei billing.phtml selbst erreichen. Dieser Trick besteht darin, ein verstecktes Element anstelle des Kontrollkästchens mit demselben Namen wie das Kontrollkästchen zu verwenden. Anstelle des onclick-Ereignisses des Kontrollkästchens können Sie das onblur-Ereignis des Kennwortfelds verwenden und die toggleRegister-Logik entsprechend ausführen. Ich verstehe, dass dies Ihren Zweck lösen wird.

BEARBEITET

Bitte fügen Sie ein Unschärfe-Ereignis wie folgt in Ihr Passwortfeld ein.

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

Fügen Sie nun in Ihrem Formular ein verstecktes Element wie dieses hinzu.

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

Ersetzen Sie nun die toggleRegister () -Methode durch die folgende

BEARBEITEN:

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();
        }
    }
}
Nasir Perwaiz
quelle
Vielen Dank! Können Sie ein Beispiel geben, wie dieser Code aussehen sollte? Weil das der Teil ist, den ich nicht erledigen kann.
JGeer
Versuchte Ihren Code, aber das hat nicht funktioniert. Ich habe alles durch Ihren Code ersetzt, aber dann werden nicht die gesamten Passwortfelder angezeigt.
JGeer
Ich habe diesen Code als Referenz gepostet. Bitte ersetzen Sie nicht den gesamten Code. Bitte markieren Sie den Unterschied und aktualisieren Sie Ihren Code entsprechend. Lass mich wissen was passiert.
Nasir Perwaiz
Bitte lesen Sie die bearbeitete Antwort und lassen Sie mich wissen, was passiert.
Nasir Perwaiz
Vielen Dank für Ihre Bearbeitung. Muss ich den gesamten Code zwischen der Zeile <? Php // SKIP STEP 1 START?> Und <? Php // SKIP STEP 1 END?> Entfernen?. Denn wenn ich diesen Code entferne und Ihren Code hinzufüge, sind die Felder verschwunden.
JGeer