В настоящее время у меня есть требование добавить настраиваемый шаг подсказки драйвера в процессе проверки magento onepage сразу после метода доставки (шаг 3), в котором я хочу, чтобы пользователь выбирал подсказку из некоторых заданных параметров (я буду делать переключатели), что будет содержать определенные суммы, предположим, что пользователь выбрал 150 долларов США, тогда эта сумма будет добавлена в общий платеж? я пробовал все другие учебники по Google, ни один из них не работает для меня, любая помощь приветствуется,
Недавно я работал над аналогичным типом требований. поэтому следуйте моим указаниям:
Я прошу вас, чтобы вы не сосредоточились на длительности ответа, просто сосредоточьтесь на результатах
шаг 1 : если вы хотите установить подсказку драйвера между отправкой и отправкой, сначала откройте
\ app \ code \ core \ Mage \ Checkout \ Block \ Onepage.php существует массив $ stepCodes (строка no: – 44). замените это
$stepCodes = array('billing', 'shipping', 'excellence2','shipping_method', 'payment', 'review');
Я использую excellence2, вы также можете использовать это имя.
Шаг 2 : теперь нам нужно создать класс Excellence2 в приложении \ code \ core \ Mage \ Checkout \ Block \ Onepage \, чтобы создать новый 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» на подсказку драйвера
Шаг 3 : -откройте OnepageController.php, который находится в приложении \ code \ core \ Mage \ Checkout \ controllers \ и найдите функцию 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 ), что нам нужно указать, где пользователь будет перенаправлять после прохождения, хотя шаг подсказки драйвера .so создать saveExcellence2Action () сразу после функции saveShippingAction ()
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 \ ваш шаблон \ 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 : теперь нам нужно создать файл excellence2.phtml в \ app \ design \ frontend \ default \ your template \ template \ checkout \ onepage \
этот файл показывает содержимое, которое вы хотите показать пользователю
<form id="co-excellence2-form" action=""> <div class="wide"> <label for="excellence2:like" class="required"><em style="color:#F00;">*</em> 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);"/> 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);" /> 150$ </li> <li> <input type="radio" name="excellence2[like]" id="excellence2:like" value="250" class="radio" onclick="savevalue(this.value);"/> 250$ </li> <li> <input type="radio" name="excellence2[like]" id="excellence2:like" value="400" class="radio" onclick="savevalue(this.value);" /> 400$ </li> <li> <input type="radio" name="excellence2[like]" id="excellence2:like" value="500" class="radio" onclick="savevalue(this.value);"/> 500$ </li> <li> <input type="radio" name="excellence2[like]" id="excellence2:like" value="15% of total amount" class="radio" onclick="savevalue(this.value);" /> 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 : теперь нам нужно создать файл excellencecheckout.js в \ skin \ frontend \ default \ your template \ 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 : теперь нам нужно создать новую функцию для сохранения данных, которые были выбраны пользователем. поэтому мы создаем новую функцию, имя которой – saveExcellence2 () сразу после финализации saveShipping ($ data, $ customerAddressId) в Onepage.php, который находится в \ app \ code \ core \ Mage \ Checkout \ Model \ Type \
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(); }
По умолчанию magento дает некоторые шаги проверки. Но иногда вам нужно добавить дополнительную информацию от клиента для дальнейшего использования. Обычная запрошенная настройка заключается в добавлении пользовательской формы в процесс проверки по умолчанию. Это не очень хорошая практика для касания основных файлов. Вы можете сделать это с помощью переопределения модулей. В этом примере Comapnyname является Ipragmatech, а имя модуля – Checkoutstep .
Шаг 1: добавление пользовательского шага в процесс оформления заказа
Откройте 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; } }
Шаг 3. Захватите представленное значение пользовательской формы и задайте значения пользовательской формы
Откройте ipragmatech> Checkoutstep> контроллеры> 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 hook. Откройте 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