2

我正在尝试在 Magento 单页结帐过程中创建一个额外的步骤。我正在关注位于http://www.excellencemagentoblog.com/magento-onestep-checkout-add-step的教程,但在审查之前特别添加了一个步骤。

我的文件夹/文件结构如下。(忽略小部件.xml) 文件夹结构

我已将当前状态的代码上传到此要点: https ://gist.github.com/Relequestual/5263498

我将主题设置为“新”。

我正在对 $this->getSteps() 进行 var_dumping,这表明“testcheck”返回 null。在 config.xml 中,如果我在 gobal、blocks、checkout、rewrite、onepage 下更改为最后带有“_TestCheck”的同一类,则结帐根本不显示,但“Test Check”出现在进度部分正确的。当我恢复此更改时,它会在 var 转储中显示为不为空,就像这样...... 测试检查 vardump 但是,我仍然没有看到实际添加到页面的步骤。

我以前没有做过任何magento,所以感觉有点过头了。我预计 xml 配置文件存在一些问题,但我已经为此工作了 2 天,对于我还能尝试什么感到有些迷茫。

我知道这个问题听起来可能与其他问题相似,但是我找不到 OP 与我所看到的症状相同的问题。

4

1 回答 1

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

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

于 2014-12-11T06:08:16.360 回答