4

Currently i have an requirement of adding a custom Driver tip step in magento onepage checkout process, right after the shipping method(step-3), in which i want user to select tip from some given options(i will make radio buttons), that will contain certain amounts, suppose user selected $150 then this amount will be added into total payment ? i tried all other tutorials over google, none of them is working for me, any help is appreciated,

4

2 に答える 2

3

私は最近、同様のタイプの要件に取り組んでいます。私の指示に従ってください:-

回答の長さに焦点を当てるのではなく、結果だけに焦点を当てるようお願いします

ステップ 1 :-配送と配送方法の間にドライバーのヒントを入れたい場合は、最初に開きます

\app\code\core\Mage\Checkout\Block\Onepage.php 配列 $stepCodes (行番号:- 44) があります。それをこれに置き換えます

$stepCodes = array('billing', 'shipping', 'excellence2','shipping_method', 'payment', 'review'); 

この名前を使用することもできます

ステップ 2 :- app\code\core\Mage\Checkout\Block\Onepage\ に Excellence2 クラスを作成する必要があるため、新しい php ファイルを作成し、そのコードをそのファイルに入れ、Excellence2.php として保存します。

class Mage_Checkout_Block_Onepage_Excellence2 extends Mage_Checkout_Block_Onepage_Abstract
{
protected function _construct()
{
    $this->getCheckout()->setStepData('excellence2', array(
        'label'     => Mage::helper('checkout')->__('Tip Ammount'),
        'is_show'   => $this->isShow()
    ));
    parent::_construct();

}
}

:- _construct() 関数のラベルに任意の名前を付けることができるようになったので、'Tip Ammount'Driver tipに変更します

ステップ 3 : -app \code\core\Mage\Checkout\controllers\ にある OnepageController.php を開き、saveBillingAction() 関数 (行番号:-296) を見つけそのコードをこれに置き換えます。

 public function saveBillingAction()
{       
    if ($this->_expireAjax())
      {
        return;
      }
    if ($this->getRequest()->isPost()) {
        //            $postData = $this->getRequest()->getPost('billing', array());
        //            $data = $this->_filterPostData($postData);
        $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'] = 'excellence2';  //Goes to our step
                $result['allow_sections'] = array('shipping');
                $result['duplicateBillingInfo'] = 'true';
            } else {
                $result['goto_section'] = 'shipping';
            }
        }

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

ステップ 4 :- 再び同じファイルOnepageController.phpに saveShippingAction() 関数 (331 行目) があり、これを次のように変更します。

 public function saveShippingAction()
 {
    if ($this->_expireAjax()) {
        return;
    }
    if ($this->getRequest()->isPost()) {
        $data = $this->getRequest()->getPost('shipping', array());
        $customerAddressId = $this->getRequest()->getPost('shipping_address_id', false);
        $result = $this->getOnepage()->saveShipping($data, $customerAddressId);

        if (!isset($result['error'])) {
            $result['goto_section'] = 'excellence2'; //Go to our step
        }
        $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
    }
  }

このコードは、ユーザーが配送ステップを通過すると、ドライバーのヒントステップに進むことを示しています。

ステップ 5 : - 同じファイル ( OnepageController.php ) で、ドライバーのヒントステップを通過した後にユーザーがリダイレクトする場所を指定する必要があります。その ため、 saveShippingAction() 関数の直後に saveExcellence2Action() を作成します

public function saveExcellence2Action()
{
    if ($this->_expireAjax()) {
        return;
    }
    if ($this->getRequest()->isPost()) {
        $data = $this->getRequest()->getPost('excellence2', array());

        $result = $this->getOnepage()->saveExcellence2($data);

        if (!isset($result['error'])) {
            $result['goto_section'] = 'shipping_method';
            $result['update_section'] = array(
                'name' => 'shipping-method',
                'html' => $this->_getShippingMethodsHtml()
            );
        }

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

ステップ 6 :- ここで、次の場所にある checkout.xml を変更します。

\app\design\frontend\default\your template\layout を開いて見つけます

<checkout_onepage_index translate="label">

そしてその特定のノードにはブロックがあります(326行目)

<block type="checkout/onepage_shipping" name="checkout.onepage.shipping" as="shipping" template="checkout/onepage/shipping.phtml"/>

上記のこの行の後に新しいブロックを追加するだけです

<block type="checkout/onepage_excellence2" name="checkout.onepage.excellence2" as="excellence2" template="checkout/onepage/excellence2.phtml"/>

ステップ 7 :- ここ で、\app\design\frontend\default\your template\template\checkout\onepage\ に Excellence2.phtml ファイルを作成する必要があります。

このファイルは、ユーザーに表示したいコンテンツを示しています

<form id="co-excellence2-form" action="">
<div class="wide"> <label for="excellence2:like" class="required"><em  style="color:#F00;">*</em>&nbsp;&nbsp;&nbsp;Select the amount of tip ,You wish to give to the driver.</label>
</div>
<div style="margin-top:20px;">
<ul>
<li>
<input type="radio" name="excellence2[like]" id="excellence2:like" value="0" checked="checked" class="radio" onclick="savevalue(this.value);"/>&nbsp;&nbsp;&nbsp;No Tip/Pay driver at the door
</li>
<li>
<input type="radio" name="excellence2[like]" id="excellence2:like" value="150" class="radio" onclick="savevalue(this.value);" />&nbsp;&nbsp;&nbsp;150$
</li>
<li>
<input type="radio" name="excellence2[like]" id="excellence2:like" value="250" class="radio"  onclick="savevalue(this.value);"/>&nbsp;&nbsp;&nbsp;250$
</li>
<li>
<input type="radio" name="excellence2[like]" id="excellence2:like" value="400" class="radio" onclick="savevalue(this.value);" />&nbsp;&nbsp;&nbsp;400$
</li>
<li>
<input type="radio" name="excellence2[like]" id="excellence2:like" value="500" class="radio"  onclick="savevalue(this.value);"/>&nbsp;&nbsp;&nbsp;500$
</li>
<li>
<input type="radio" name="excellence2[like]" id="excellence2:like" value="15% of total amount" class="radio" onclick="savevalue(this.value);" />&nbsp;&nbsp;&nbsp;15% of Total Amount
</li>
</ul>
</div>
<fieldset>
<div class="buttons-set" id="excellence2-buttons-container">
<p class="required"><?php echo $this->__('* Required Fields') ?></p>
<button type="button" title="<?php echo $this->__('Continue') ?>" class="button" onclick="excellence2.save()"><span><span><?php echo $this->__('Continue') ?></span></span>    
</button>
<span class="please-wait" id="excellence2-please-wait" style="display:none;">
<img src="<?php echo $this->getSkinUrl('images/opc-ajax-loader.gif') ?>" alt="<?php echo $this->__('Loading next step...') ?>" title="<?php echo $this->__('Loading next step...') ?>" class="v-middle" /> <?php echo $this->__('Loading next step...') ?>
</span>
</div>
</fieldset>
</form>
<script type="text/javascript">
//<![CDATA[
var excellence2 = new ExcellenceMethod2('co-excellence2-form','<?php echo  $this->getUrl('checkout/onepage/saveExcellence2') ?>');
var excellenceForm2 = new VarienForm('co-excellence2-form');
//]]>

</script>

ステップ 8 :-ここで、\skin\frontend\default\your template\js に Excellencecheckout.js ファイルを作成する必要があります

var ExcellenceMethod2 = Class.create();
ExcellenceMethod2.prototype = {
initialize: function(form, saveUrl){
    this.form = form;
    if ($(this.form)) {
        $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
    }
    this.saveUrl = saveUrl;
    this.validator = new Validation(this.form);
    this.onSave = this.nextStep.bindAsEventListener(this);
    this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
},

validate: function() {

    return true;
},

save: function(){

    //alert('hi');
    if (checkout.loadWaiting!=false) return;
    if (this.validate()) {
        checkout.setLoadWaiting('excellence2');
        var request = new Ajax.Request(
            this.saveUrl,
            {
                method:'post',
                onComplete: this.onComplete,
                onSuccess: this.onSave,
                onFailure: checkout.ajaxFailure.bind(checkout),
                parameters: Form.serialize(this.form)
            }
        );
    }
},

resetLoadWaiting: function(transport){
    checkout.setLoadWaiting(false);
},

nextStep: function(transport){
    if (transport && transport.responseText){
        try{
            response = eval('(' + transport.responseText + ')');
        }
        catch (e) {
            response = {};
        }
    }

    if (response.error) {
        alert(response.message);
        return false;
    }

    if (response.update_section) {
        $('checkout-'+response.update_section.name+'-load').update(response.update_section.html);
    }


    if (response.goto_section) {
        //alert(response);
        checkout.gotoSection(response.goto_section);
        checkout.reloadProgressBlock();
        return;
    }

    checkout.setPayment();
}
}

ステップ 9 :- ここで、ユーザーが選択したデータを保存するための新しい関数を作成する必要があります。そのため、\app\code\core\Mage\Checkout\Model\Type\ にある Onepage.php の saveShipping($data, $customerAddressId) 関数の直後に、saveExcellence2 ()という名前の新しい関数を作成しています。

public function saveExcellence2($data)
{
    if (empty($data)) 
    {
        return array('error' => -1, 'message' => $this->_helper->__('Invalid data.'));
    }
    $this->getQuote()->setExcellenceLike2($data['like']);
    $this->getQuote()->collectTotals();
    $this->getQuote()->save();

    $this->getCheckout()

    ->setStepData('excellence2', 'complete', true)
    ->setStepData('shipping_method', 'allow', true);

    return array();
}
于 2013-04-30T12:38:50.850 に答える
0

デフォルトでは、magento はいくつかのチェックアウト手順を提供します。ただし、後で参照できるように、顧客からの追加情報を追加する必要がある場合があります。一般的に要求されるカスタマイズは、デフォルトのチェックアウト プロセスにカスタム フォームを追加することです。これは、コア ファイルに触れるのは良い習慣ではありません。これは、モジュールをオーバーライドすることで実行できます。この例では、会社名はIpragmatechで、モジュール名はCheckoutstepです。

Step1: チェックアウト プロセスにカスタム ステップを追加する

Ipragmatech > Checkoutstep > Block > Onepage > Checkoutstep.php ファイルを開き、次のコードを記述します。

    class Ipragmatech_Checkoutstep_Block_Onepage_Checkoutstep extends Mage_Checkout_Block_Onepage_Abstract
    {
       protected function _construct()
       {     
          $this->getCheckout()->setStepData('checkoutstep', array(
          'label'     => Mage::helper('checkout')->__('Invitation to participation'),
          'is_show'   => true
        ));
        parent::_construct();
       }
     }

ステップ 2: チェックアウト プロセスの必要な場所にステップを追加します。

Ipragmatech > Checkoutstep > Block > Onepage > Checkoutstep.php ファイルを開き、次のコードを記述します。

    class Ipragmatech_Checkoutstep_Block_Onepage extends Mage_Checkout_Block_Onepage
    {
      public function getSteps()
      {
             $steps = array();

             if (!$this->isCustomerLoggedIn()) {
                $steps['login'] = $this->getCheckout()->getStepData('login');
             }

            $stepCodes = array('billing', 'shipping', 'shipping_method', 'payment', 'checkoutstep', 'review');
         foreach ($stepCodes as $step) {
             $steps[$step] = $this->getCheckout()->getStepData($step);
          }

    return $steps;
   }
}

Step3: 送信されたカスタム フォームの値を取得し、カスタム フォームの値を設定する

ipragmatech > Checkoutstep > controllers > OnepageController.php を開き、次の関数を記述します。

    public function saveCheckoutstepAction()
    {
      $this->_expireAjax();
      if ($this->getRequest()->isPost()) {

     //Grab the submited value 
     $_entrant_name = $this->getRequest()->getPost('entrant_name',"");
     $_entrant_phone = $this->getRequest()->getPost('entrant_phone',"");
     $_entrant_email = $this->getRequest()->getPost('entrant_email',"");
     $_permanent_address = $this->getRequest() ->getPost('permanent_address',"");
     $_address = $this->getRequest()->getPost('local_address',"");

     Mage::getSingleton('core/session') ->setIpragmatechCheckoutstep(serialize(array(
    'entrant_name' =>$_entrant_name,
    'entrant_phone' =>$_entrant_phone,
    'entrant_email' =>$_entrant_email,
    'permanent_address' =>$_permanent_address,
    'address' =>$_address
     )));

    $result = array();
    $redirectUrl = $this->getOnePage()->getQuote()->getPayment() ->getCheckoutRedirectUrl();
        if (!$redirectUrl) {
            $this->loadLayout('checkout_onepage_review');
            $result['goto_section'] = 'review';
            $result['update_section'] = array(
                'name' => 'review',
                'html' => $this->_getReviewHtml()
            );

        }

        if ($redirectUrl) {
            $result['redirect'] = $redirectUrl;
        }

        $this->getResponse()->setBody(Zend_Json::encode($result));
    }
}

Step4: カスタムフォームの情報を保存する

checkout_onepage_controller_success_action イベント フックが呼び出されたとき。Ipragmatech > Checkoutstep > Model >Observer.php を開き、次のように記述します。

    class Ipragmatech_Checkoutstep_Model_Observer {
      const ORDER_ATTRIBUTE_FHC_ID = 'checkoutstep';
      public function hookToOrderSaveEvent() {
      if (Mage::helper('checkoutstep')->isEnabled()) {
         $order = new Mage_Sales_Model_Order ();
         $incrementId = Mage::getSingleton ( 'checkout/session' )->getLastRealOrderId ();
         $order->loadByIncrementId ( $incrementId );

       // Fetch the data 
       $_checkoutstep_data = null;
       $_checkoutstep_data = Mage::getSingleton ( 'core/session' )->getIpragmatechCheckoutstep ();
       $model = Mage::getModel ( 'checkoutstep/customerdata' )->setData ( unserialize ( $_checkoutstep_data ) );
       $model->setData ( "order_id",$order["entity_id"] );
       try {
           $insertId = $model->save ()->getId ();
             Mage::log ( "Data successfully inserted. Insert ID: " . $insertId, null, 'mylog.log');
        } catch ( Exception $e ) {
            Mage::log ( "EXCEPTION " . $e->getMessage (), null, 'mylog.log' );
          }
        }
    }

}

Magento – Add Custom Form in Checkout Extension は、e コマース Web サイトのチェックアウト プロセスにステップを追加するための完全なソリューションです。これにより、管理者はカスタム テーブルからデータを CSV 形式でエクスポートできます。リンクにアクセスして、この無料の拡張機能を入手してください http://www.magentocommerce.com/magento-connect/custom-form-in-checkout.html

于 2014-12-11T05:52:06.027 に答える