在一页签出中添加一个步骤


18

是否有任何扩展程序,开源的Magento模块或教程,可以使在页面结帐中添加步骤更加容易?我已经在核心代码上戳了几次了,似乎有很多硬编码的步骤信息。


5
不幸的是,Checkout代码似乎不太灵活,很多信息都从模板硬编码到javascript手风琴文件中。
Allan MacGregor 2014年

1
我已按照本教程进行操作,并能够在单页签出中添加新的步骤。无论如何,需要覆盖许多核心文件才能完成此步骤。希望这将有所帮助excellencemagentoblog.com/magento-onestep-checkout-add-step
Sukeshini

Answers:


6

这个问题的简短答案最终是“否”。从较高的角度来看,添加新的结帐步骤意味着

  1. 向一步结帐页面添加一个新块

  2. 将该块本身注册为一个步骤

  3. 将该块与处理所有交互的原型对象连接

  4. 重写几种Magento核心方法以作为一个步骤插入块

  5. 一些ajax技巧使进度工作正常进行。

总的来说,这超出了单个堆栈溢出问题的范围。在另一个问题中链接的教程有很多您需要的东西,并且我还创建了一个新的商业扩展程序,以使所有这些操作变得更加容易


4

默认情况下,magento给出一些结帐步骤。但是有时您需要添加客户的其他信息以供将来参考。常见的自定义要求是在默认结帐流程中添加自定义表单。触摸核心文件不是一个好习惯。您可以通过覆盖模块来做到这一点。在此示例中,Comapnyname是Ipragmatech,模块名称是Checkoutstep

步骤1:在结帐流程中添加“自定义”步骤

打开Ipragmatech> Checkoutstep>块> 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>块> 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;
   }
}

步骤3:获取自定义表单的提交值并设置自定义表单的值

打开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));
    }
}

步骤4:保存自定义表单信息

当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 –在Checkout Extension中添加自定义表单是一个完整的解决方案,可以为您的电子商务网站在Checkout流程中添加额外的步骤。它允许管理员以CSV格式从自定义表中导出数据。

访问链接以获取此免费扩展程序http://www.magentocommerce.com/magento-connect/custom-form-in-checkout.html


0

是的,这里有一个很好的教程“ http://excellencemagentoblog.com/magento-onestep-checkout-add-step


4
您应该解释一下该网址末尾的内容。单链接答案不是最佳答案。
Marius

网址本身显示了magento-onestep-checkout-add-step,这就是问题的所在。
Dhanpat Saran 2014年

5
我同意您的看法,链接中的解释很棒,但请看一下SO网站上的答案应该如何:meta.stackexchange.com/a/8259/224252以及以下内容:magento.stackexchange.com/help/how答案
马吕斯(Marius)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.