Оформление заказа в один шаг – tpl шаблонизатор — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
'''Актуально для 2.9.5'''
+
'''Актуально для 2.11'''
  
 
В данной статье будет описан принцип создания формы оформления заказа за один шаг, т.е. все необходимые данные, регистрационные данные покупателя, способ доставки, способ оплаты и т.д. представлены на одной страницы. Для использования информации в данной статье версия вашей системы должна быть не ниже 2.8.4.3, иначе код не будет нормально функционировать при наличии в модуле Интернет-магазин способа доставки Курьером, и способа оплаты "Курьером при получении".
 
В данной статье будет описан принцип создания формы оформления заказа за один шаг, т.е. все необходимые данные, регистрационные данные покупателя, способ доставки, способ оплаты и т.д. представлены на одной страницы. Для использования информации в данной статье версия вашей системы должна быть не ниже 2.8.4.3, иначе код не будет нормально функционировать при наличии в модуле Интернет-магазин способа доставки Курьером, и способа оплаты "Курьером при получении".
  
 +
Нам понадобятся дополнительные php-методы для реализации данной задачи, которые необходимо добавить внутри абстрактного класса файла '''classes/modules/emarket/__custom.php''', сами методы следующие:
  
Нам понадобятся дополнительные php-методы для реализации данной задачи, которые необходимо добавить внутри абстрактного класса файла '''classes/modules/emarket/__custom.php''', сами методы следующие:
 
 
<source lang="php">
 
<source lang="php">
 +
public function deliveryAddressesListCustom($template = 'onestep') {
 +
$order = $this->getBasketOrder(false);
 +
list($tpl_block, $tpl_item) = def_module::loadTemplates(
 +
"emarket/delivery/{$template}.tpl",
 +
"delivery_address_block",
 +
"delivery_address_item"
 +
);
 +
 +
$customer  = customer::get();
 +
$addresses = $customer->delivery_addresses;
 +
$items_arr = array();
 +
$currentDeliveryId = $order->getValue('delivery_address');
 +
 +
$collection = umiObjectsCollection::getInstance();
 +
 +
if (is_array($addresses)) foreach($addresses as $address) {
 +
$addressObject = $collection->getObject($address);
 +
 +
$item_arr = array(
 +
'attribute:id' => $address,
 +
'attribute:name' => $addressObject->name
 +
);
 +
 +
if ($address == $currentDeliveryId) $item_arr['attribute:active'] = 'active';
 +
 +
$items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $address);
 +
}
 +
 +
$types  = umiObjectTypesCollection::getInstance();
 +
$typeId = $types->getBaseType("emarket", "delivery_address");
 +
 +
if ($tpl_block) {
 +
return def_module::parseTemplate($tpl_block, array('items' => $items_arr, 'type_id' => $typeId));
 +
}
 +
}
 +
 +
public function deliveryListCustom($template = 'onestep') {
 +
$order = $this->getBasketOrder(false);
 +
list($tpl_block, $tpl_item_free, $tpl_item_priced) = def_module::loadTemplates(
 +
"emarket/delivery/{$template}.tpl",
 +
'delivery_block',
 +
'delivery_item_free',
 +
'delivery_item_priced'
 +
);
  
public function deliveryAddressesList($template = 'default'){
+
if (!isset($_SESSION['emarket'])) $_SESSION['emarket'] = array();
    $order = $this->getBasketOrder(false);
+
if (!isset($_SESSION['emarket']['delivery'])) $_SESSION['emarket']['delivery'] = array();
    list($tpl_block, $tpl_item) = def_module::loadTemplates("./tpls/emarket/delivery/{$template}.tpl",
 
'delivery_address_block', 'delivery_address_item');
 
  
$customer  = customer::get();
+
$deliveryIds = delivery::getList();
$addresses = $customer->delivery_addresses;
+
$items_arr = array();
$items_arr = array();
+
$currentDeliveryId = $order->getValue('delivery_id');
$currentDeliveryId = $order->getValue('delivery_address');
 
  
$collection = umiObjectsCollection::getInstance();
+
foreach($deliveryIds as $delivery) {
 +
$delivery = delivery::get($delivery);
 +
if ($delivery->validate($order) == false) {
 +
continue;
 +
}
  
if(is_array($addresses)) foreach($addresses as $address) {
+
$deliveryObject = $delivery->getObject();
$addressObject = $collection->getObject($address);
+
$deliveryPrice  = $delivery->getDeliveryPrice($order);
 +
$_SESSION['emarket']['delivery'][$delivery->id] = (float)$deliveryPrice;
  
$item_arr = array(
+
$item_arr = array(
'attribute:id' => $address,
+
'attribute:id' => $deliveryObject->id,
'attribute:name' => $addressObject->name
+
'attribute:name' => $deliveryObject->name,
);
+
'attribute:price' => $deliveryPrice.'',
 +
'xlink:href' => $deliveryObject->xlink
 +
);
  
if($address == $currentDeliveryId) $item_arr['attribute:active'] = 'active';
+
if ($delivery->id == $currentDeliveryId) $item_arr['attribute:active'] = 'active';
  
$items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $address);
+
$tpl_item = $deliveryPrice ? $tpl_item_priced : $tpl_item_free;
}
+
$items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $deliveryObject->id);
 +
}
  
$types  = umiObjectTypesCollection::getInstance();
+
if ($tpl_block) {
$typeId = $types->getBaseType("emarket", "delivery_address");
+
return def_module::parseTemplate($tpl_block, array('items' => $items_arr));
 +
} else {
 +
return array('items' => array('nodes:item' => $items_arr));
 +
}
  
if($tpl_block) {
 
return def_module::parseTemplate($tpl_block, array('items' => $items_arr, 'type_id' => $typeId));
 
}
 
 
}
 
}
  
 +
public function paymentsListCustom($template = 'onestep') {
 +
$order = $this->getBasketOrder(false);
 +
list($tpl_block, $tpl_item) = def_module::loadTemplates("emarket/payment/{$template}.tpl", 'payment_block', 'payment_item');
 +
 +
$payments = payment::getList();
 +
$items = array();
 +
$currentPaymentId = $order->getValue('payment_id');
  
public function deliveryList($template = 'default') {
+
foreach($payments as $paymentId) {
  $order = $this->getBasketOrder(false);
+
$payment = payment::get($paymentId, $order);
  list($tpl_block, $tpl_item_free, $tpl_item_priced) = def_module::loadTemplates("./tpls/emarket/delivery/{$template}.tpl",
+
if($payment->validate($order) == false) {
  'delivery_block', 'delivery_item_free', 'delivery_item_priced');
+
continue;
 
+
}
  if(!isset($_SESSION['emarket'])) $_SESSION['emarket'] = array();
+
$paymentObject = $payment->getObject();
  if(!isset($_SESSION['emarket']['delivery'])) $_SESSION['emarket']['delivery'] = array();
+
$paymentTypeId = $paymentObject->getValue('payment_type_id');
 
+
$paymentTypeName = umiObjectsCollection::getInstance()->getObject($paymentTypeId)->getValue('class_name');
  $deliveryIds = delivery::getList(); $items_arr = array();
 
  $currentDeliveryId = $order->getValue('delivery_id');
 
 
 
  foreach($deliveryIds as $delivery) {
 
  $delivery = delivery::get($delivery);
 
  if($delivery->validate($order) == false) {
 
  continue;
 
  }
 
 
 
  $deliveryObject = $delivery->getObject();
 
  $deliveryPrice  = $delivery->getDeliveryPrice($order);
 
  $_SESSION['emarket']['delivery'][$delivery->id] = (float)$deliveryPrice;
 
  $item_arr = array(
 
  'attribute:id' => $deliveryObject->id,
 
  'attribute:name' => $deliveryObject->name,
 
  'attribute:price' => $deliveryPrice.'',
 
  'xlink:href' => $deliveryObject->xlink
 
  );
 
 
 
  if($delivery->id == $currentDeliveryId) $item_arr['attribute:active'] = 'active';
 
 
 
  $tpl_item = $deliveryPrice ? $tpl_item_priced : $tpl_item_free;
 
  $items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $deliveryObject->id);
 
  }
 
 
 
  if($tpl_block) {
 
  return def_module::parseTemplate($tpl_block, array('items' => $items_arr));
 
  } else {
 
  return array('items' => array('nodes:item' => $items_arr));
 
  }
 
  
 +
if($paymentTypeName == 'social') {
 +
continue;
 +
}
 +
 +
$item = array(
 +
'attribute:id' => $paymentObject->id,
 +
'attribute:name' => $paymentObject->name,
 +
'attribute:type-name' => $paymentTypeName,
 +
'xlink:href' => $paymentObject->xlink
 +
);
 +
 +
if($paymentId == $currentPaymentId) {
 +
$item['attribute:active'] = 'active';
 +
}
 +
 +
$items[] = def_module::parseTemplate($tpl_item, $item, false, $paymentObject->id);
 +
}
 +
 +
if($tpl_block && !def_module::isXSLTResultMode()) {
 +
return def_module::parseTemplate($tpl_block, array('items' => $items));
 +
} else {
 +
return array('items' => array('nodes:item' => $items));
 +
}
 
}
 
}
  
public function paymentsList($template = 'default') {
+
public function personalInfoCustom($template = 'onestep') {
  $order = $this->getBasketOrder(false);
+
if (!permissionsCollection::getInstance()->isAuth()){
  list($tpl_block, $tpl_item) = def_module::loadTemplates("./tpls/emarket/payment/{$template}.tpl", 'payment_block', 'payment_item');
+
$customerId = customer::get()->id;
 
+
$cmsController = cmsController::getInstance();
  $payementIds = payment::getList(); $items_arr = array();
+
$data = $cmsController->getModule('data');
  $currentPaymentId = $order->getValue('payment_id');
 
 
 
  foreach($payementIds as $paymentId) {
 
  $payment = payment::get($paymentId);
 
  if($payment->validate($order) == false) continue;
 
  $paymentObject = $payment->getObject();
 
  $paymentTypeId = $paymentObject->getValue('payment_type_id');
 
  $paymentTypeName = umiObjectsCollection::getInstance()->getObject($paymentTypeId)->getValue('class_name');
 
 
 
  if( $paymentTypeName == 'social') continue;
 
 
 
  $item_arr = array(
 
  'attribute:id' => $paymentObject->id,
 
  'attribute:name' => $paymentObject->name,
 
  'attribute:type-name' => $paymentTypeName,
 
  'xlink:href' => $paymentObject->xlink
 
  );
 
 
 
  if($paymentId == $currentPaymentId) {
 
  $item_arr['attribute:active'] = 'active';
 
  }
 
 
 
  $items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $paymentObject->id);
 
  }
 
 
 
  if($tpl_block) {
 
  return def_module::parseTemplate($tpl_block, array('items' => $items_arr));
 
  } else {
 
  return array('items' => array('nodes:item' => $items_arr));
 
  }
 
  
 +
return $data->getEditForm($customerId, $template);
 +
} else return '';
 
}
 
}
  
public function personalInfo($template = 'default') {
+
public function saveInfoCustom(){
  if (!permissionsCollection::getInstance()->isAuth()){
+
$order = $this->getBasketOrder(false);
     $customerId = customer::get()->id;
+
 
    $cmsController = cmsController::getInstance();
+
//сохранение регистрационных данных
    $data = $cmsController->getModule('data');
+
$cmsController = cmsController::getInstance();
   
+
$data = $cmsController->getModule('data');
    return $data->getEditForm($customerId, $template);
+
$data->saveEditedObject(customer::get()->id, false, true);
  }else return '';
+
 
}
+
//сохранение адреса доставки
 +
$addressId = getRequest('delivery-address');
 +
if ($addressId == 'new') {
 +
$collection = umiObjectsCollection::getInstance();
 +
$types      = umiObjectTypesCollection::getInstance();
 +
$typeId     = $types->getBaseType("emarket", "delivery_address");
 +
$customer  = customer::get();
 +
$addressId  = $collection->addObject("Address for customer #".$customer->id, $typeId);
 +
$dataModule = $cmsController->getModule("data");
 +
if ($dataModule) {
 +
if (!$dataModule->saveEditedObject($addressId, true, true)) {
 +
$dataModule->saveEditedObjectWithIgnorePermissions($addressId, true, true); // начиная с версии 2.9.5
 +
}
 +
}
 +
$customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
 +
}
 +
$order->delivery_address = $addressId;
 +
 
 +
//сохранение способа доставки
 +
$deliveryId = getRequest('delivery-id');
 +
if ($deliveryId){
 +
$delivery = delivery::get($deliveryId);
 +
$deliveryPrice = (float) $delivery->getDeliveryPrice($order);
 +
$order->setValue('delivery_id', $deliveryId);
 +
$order->setValue('delivery_price', $deliveryPrice);
 +
}
 +
 
 +
//сохранение способа оплаты и редирект на итоговую страницу
 +
$order->setValue('payment_id', getRequest('payment-id'));
 +
 
 +
$order->refresh();
 +
 
 +
$paymentId = getRequest('payment-id');
 +
if (!$paymentId) {
 +
$this->errorNewMessage(getLabel('error-emarket-choose-payment'));
 +
$this->errorPanic();
 +
}
 +
$payment = payment::get($paymentId);
  
public function saveinfo(){
+
if ($payment instanceof payment) {
  $order = $this->getBasketOrder(false);
+
$paymentName = $payment->getCodeName();
  //сохранение регистрационных данных
+
$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/purchase/payment/{$paymentName}/";
  $cmsController = cmsController::getInstance();
+
} else {
  $data = $cmsController->getModule('data');
+
$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/cart/";
  $data->saveEditedObject(customer::get()->id, false, true);
+
}
 
+
$this->redirect($url);
  //сохранение способа доставки
 
  $deliveryId = getRequest('delivery-id');
 
  if($deliveryId){
 
    $delivery = delivery::get($deliveryId);
 
    $deliveryPrice = (float) $delivery->getDeliveryPrice($order);
 
    $order->setValue('delivery_id', $deliveryId);
 
    $order->setValue('delivery_price', $deliveryPrice);
 
  }
 
  //сохранение адреса доставки
 
  $addressId = getRequest('delivery-address');
 
  if($addressId == 'new') {
 
    $collection = umiObjectsCollection::getInstance();
 
    $types      = umiObjectTypesCollection::getInstance();
 
    $typeId    = $types->getBaseType("emarket", "delivery_address");
 
    $customer  = customer::get();
 
    $addressId  = $collection->addObject("Address for customer #".$customer->id, $typeId);
 
    $dataModule = $cmsController->getModule("data");
 
    if($dataModule) {
 
      if(!$dataModule->saveEditedObject($addressId, true, true))
 
$dataModule->saveEditedObjectWithIgnorePermissions($addressId, true, true); // начиная с версии 2.9.5
 
    }
 
    $customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
 
  }
 
  $order->delivery_address = $addressId;
 
 
 
  //сохранение способа оплаты и редирект на итоговую страницу
 
  $order->setValue('payment_id', getRequest('payment-id'));
 
 
 
  $order->refresh();
 
 
 
  $paymentId = getRequest('payment-id');
 
  if(!$paymentId) {
 
    $this->errorNewMessage(getLabel('error-emarket-choose-payment'));
 
    $this->errorPanic();
 
  }
 
  $payment = payment::get($paymentId);
 
 
 
  if($payment instanceof payment) {
 
    $paymentName = $payment->getCodeName();
 
    $url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/purchase/payment/{$paymentName}/";
 
  } else {
 
    $url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/cart/";
 
  }
 
  $this->redirect($url);
 
 
}
 
}
 
</source>
 
</source>
  
 +
также в папку '''classes/modules/emarket/''' необходимо добавить файл '''permissions.custom.php''' следующего содержания:
  
также в папку '''classes/modules/emarket/''' необходимо добавить файл '''permissions.custom.php''' следующего содержания:
 
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
$permissions = array('purchasing' => array('deliveryList', 'deliveryAddressesList', 'paymentsList', 'personalInfo', 'saveinfo'));
+
$permissions = array('purchasing' => array('deliveryListCustom', 'deliveryAddressesListCustom', 'paymentsListCustom', 'personalInfoCustom', 'saveInfoCustom'));
 
?>
 
?>
 
</source>
 
</source>
  
 
Необходимо создать шаблон '''tpls/emarket/delivery/onestep.tpl''':
 
Необходимо создать шаблон '''tpls/emarket/delivery/onestep.tpl''':
 +
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
 
$FORMS = Array();
 
$FORMS = Array();
+
 
 
$FORMS['delivery_block'] = <<<END
 
$FORMS['delivery_block'] = <<<END
 
<h3 class="dost">Выберите подходящий вам способ доставки:</h3>
 
<h3 class="dost">Выберите подходящий вам способ доставки:</h3>
Строка 207: Строка 222:
 
<li><input type="radio" name="delivery-id" value="%id%" checked="checked" /> %name% - бесплатно</li>
 
<li><input type="radio" name="delivery-id" value="%id%" checked="checked" /> %name% - бесплатно</li>
 
END;
 
END;
+
 
 
$FORMS['delivery_item_priced'] = <<<END
 
$FORMS['delivery_item_priced'] = <<<END
 
<li><input type="radio" name="delivery-id" value="%id%" /> %name% - %price%</li>
 
<li><input type="radio" name="delivery-id" value="%id%" /> %name% - %price%</li>
 
END;
 
END;
 
  
 
$FORMS['delivery_address_block'] = <<<END
 
$FORMS['delivery_address_block'] = <<<END
<div class="adrest">
+
<div class="adrest">
<h3 class="dost">Выберите подходящий вам адрес доставки:</h3>
+
<h3 class="dost">Выберите подходящий вам адрес доставки:</h3>
<ul>
+
<ul>
%items%
+
%items%
<li>
+
<li>
<input type="radio" name="delivery-address" value="new" /> <b>Новый адрес доставки:</b>
+
<input type="radio" name="delivery-address" value="new" /> <b>Новый адрес доставки:</b>
<table cellspacing="1" cellpadding="1" width="100%" border="0">
+
<table cellspacing="1" cellpadding="1" width="100%" border="0">
%data getCreateForm(%type_id%, 'onestep')%
+
%data getCreateForm(Здесь нужно подставить ид типа данных "Адрес доставки", 'onestep')%
</table>
+
</table>
</li>
+
</li>
</ul>
+
</ul>
</div>
+
</div>
 
END;
 
END;
  
Строка 235: Строка 249:
 
</source>
 
</source>
  
 +
В макросе '''data getCreateForm()''', первый параметр - это id типа данных "Адрес доставки" в модуле "Шаблоны данных", первая вкладка, раздел "Справочники", этот id вы должны для вашей системы определить самостоятельно и подставить в макрос data getCreateForm().
  
 
Шаблон '''tpls/emarket/payment/onestep.tpl''':
 
Шаблон '''tpls/emarket/payment/onestep.tpl''':
 +
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
Строка 255: Строка 271:
 
</source>
 
</source>
  
 +
Шаблон '''tpls/data/reflection/onestep.tpl''':
  
Шаблон '''tpls/data/reflection/onestep.tpl''':
 
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
Строка 274: Строка 290:
 
%fields%
 
%fields%
 
END;
 
END;
 
  
 
$FORMS['reflection_field_string'] = <<<END
 
$FORMS['reflection_field_string'] = <<<END
Строка 287: Строка 302:
 
</tr>
 
</tr>
 
END;
 
END;
 
  
 
$FORMS['reflection_field_text'] = <<<END
 
$FORMS['reflection_field_text'] = <<<END
Строка 340: Строка 354:
  
 
В шаблоне '''tpls/emarket/default.tpl''', в блоке '''order_block''', форма должна быть примерно следующая:
 
В шаблоне '''tpls/emarket/default.tpl''', в блоке '''order_block''', форма должна быть примерно следующая:
 +
 
<source lang="php">
 
<source lang="php">
    <form action="%pre_lang%/emarket/saveinfo/">
+
<form action="%pre_lang%/emarket/saveInfoCustom/">
      %emarket deliveryList('onestep')%
+
%emarket deliveryListCustom('onestep')%
        %emarket deliveryAddressesList('onestep')%
+
%emarket deliveryAddressesListCustom('onestep')%
<p></p>
+
<table cellspacing="1" cellpadding="1" width="100%" border="0">
      <table cellspacing="1" cellpadding="1" width="100%" border="0">
+
</table>
      </table>
+
<br/>
      <br/>
+
%emarket paymentsListCustom('onestep')%
      %emarket paymentsList('onestep')%  
+
<br/>
      <br/>
+
<table cellspacing="1" cellpadding="1" width="100%" border="0">
      <table cellspacing="1" cellpadding="1" width="100%" border="0">
+
%emarket personalInfoCustom('onestep')%
      %emarket personalInfo('onestep')%  
+
</table>
      </table>
+
<br/>
      <br/>  
+
<input type="submit" value="Оформить заказ" />
      <input type="submit" value="Оформить заказ" />
+
</form>
    </form>  
 
 
</source>
 
</source>
  
 
В макросе '''data getCreateForm()''', первый параметр это id типа данных "Адрес доставки" в модуле "Шаблоны данных", первая вкладка, раздел "Справочники", этот id вы должны для вашей системы определить самостоятельно и подставить в макрос data getCreateForm().
 
 
[[Категория:Написание кастомных макросов]][[Категория:Верстка в TPL]]
 
[[Категория:Написание кастомных макросов]][[Категория:Верстка в TPL]]
 
[[Категория:Модуль Интернет магазин]]
 
[[Категория:Модуль Интернет магазин]]

Версия 11:05, 8 декабря 2015

Актуально для 2.11

В данной статье будет описан принцип создания формы оформления заказа за один шаг, т.е. все необходимые данные, регистрационные данные покупателя, способ доставки, способ оплаты и т.д. представлены на одной страницы. Для использования информации в данной статье версия вашей системы должна быть не ниже 2.8.4.3, иначе код не будет нормально функционировать при наличии в модуле Интернет-магазин способа доставки Курьером, и способа оплаты "Курьером при получении".

Нам понадобятся дополнительные php-методы для реализации данной задачи, которые необходимо добавить внутри абстрактного класса файла classes/modules/emarket/__custom.php, сами методы следующие:

public function deliveryAddressesListCustom($template = 'onestep') {
	$order = $this->getBasketOrder(false);
	list($tpl_block, $tpl_item) = def_module::loadTemplates(
		"emarket/delivery/{$template}.tpl",
		"delivery_address_block",
		"delivery_address_item"
	);

	$customer  = customer::get();
	$addresses = $customer->delivery_addresses;
	$items_arr = array();
	$currentDeliveryId = $order->getValue('delivery_address');

	$collection = umiObjectsCollection::getInstance();

	if (is_array($addresses)) foreach($addresses as $address) {
		$addressObject = $collection->getObject($address);

		$item_arr = array(
			'attribute:id'		=> $address,
			'attribute:name'	=> $addressObject->name
		);

		if ($address == $currentDeliveryId) $item_arr['attribute:active'] = 'active';

		$items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $address);
	}

	$types  = umiObjectTypesCollection::getInstance();
	$typeId = $types->getBaseType("emarket", "delivery_address");

	if ($tpl_block) {
		return def_module::parseTemplate($tpl_block, array('items' => $items_arr, 'type_id' => $typeId));
	}
}

public function deliveryListCustom($template = 'onestep') {
	$order = $this->getBasketOrder(false);
	list($tpl_block, $tpl_item_free, $tpl_item_priced) = def_module::loadTemplates(
		"emarket/delivery/{$template}.tpl",
		'delivery_block',
		'delivery_item_free',
		'delivery_item_priced'
	);

	if (!isset($_SESSION['emarket'])) $_SESSION['emarket'] = array();
	if (!isset($_SESSION['emarket']['delivery'])) $_SESSION['emarket']['delivery'] = array();

	$deliveryIds = delivery::getList();
	$items_arr = array();
	$currentDeliveryId = $order->getValue('delivery_id');

	foreach($deliveryIds as $delivery) {
		$delivery = delivery::get($delivery);
		if ($delivery->validate($order) == false) {
			continue;
		}

		$deliveryObject = $delivery->getObject();
		$deliveryPrice  = $delivery->getDeliveryPrice($order);
		$_SESSION['emarket']['delivery'][$delivery->id] = (float)$deliveryPrice;

		$item_arr = array(
			'attribute:id'		=> $deliveryObject->id,
			'attribute:name'	=> $deliveryObject->name,
			'attribute:price'	=> $deliveryPrice.'',
			'xlink:href'		=> $deliveryObject->xlink
		);

		if ($delivery->id == $currentDeliveryId) $item_arr['attribute:active'] = 'active';

		$tpl_item = $deliveryPrice ? $tpl_item_priced : $tpl_item_free;
		$items_arr[] = def_module::parseTemplate($tpl_item, $item_arr, false, $deliveryObject->id);
	}

	if ($tpl_block) {
		return def_module::parseTemplate($tpl_block, array('items' => $items_arr));
	} else {
		return array('items' => array('nodes:item'	=> $items_arr));
	}

}

public function paymentsListCustom($template = 'onestep') {
	$order = $this->getBasketOrder(false);
	list($tpl_block, $tpl_item) = def_module::loadTemplates("emarket/payment/{$template}.tpl", 'payment_block', 'payment_item');

	$payments = payment::getList();
	$items = array();
	$currentPaymentId = $order->getValue('payment_id');

	foreach($payments as $paymentId) {
		$payment = payment::get($paymentId, $order);
		if($payment->validate($order) == false) {
			continue;
		}
		$paymentObject = $payment->getObject();
		$paymentTypeId = $paymentObject->getValue('payment_type_id');
		$paymentTypeName = umiObjectsCollection::getInstance()->getObject($paymentTypeId)->getValue('class_name');

		if($paymentTypeName == 'social') {
			continue;
		}

		$item = array(
			'attribute:id'			=> $paymentObject->id,
			'attribute:name'		=> $paymentObject->name,
			'attribute:type-name'	=> $paymentTypeName,
			'xlink:href'			=> $paymentObject->xlink
		);

		if($paymentId == $currentPaymentId) {
			$item['attribute:active'] = 'active';
		}

		$items[] = def_module::parseTemplate($tpl_item, $item, false, $paymentObject->id);
	}

	if($tpl_block && !def_module::isXSLTResultMode()) {
		return def_module::parseTemplate($tpl_block, array('items' => $items));
	} else {
		return array('items' => array('nodes:item'	=> $items));
	}
}

public function personalInfoCustom($template = 'onestep') {
	if (!permissionsCollection::getInstance()->isAuth()){
		$customerId = customer::get()->id;
		$cmsController = cmsController::getInstance();
		$data = $cmsController->getModule('data');

		return $data->getEditForm($customerId, $template);
	} else return '';
}

public function saveInfoCustom(){
	$order = $this->getBasketOrder(false);

	//сохранение регистрационных данных
	$cmsController = cmsController::getInstance();
	$data = $cmsController->getModule('data');
	$data->saveEditedObject(customer::get()->id, false, true);

	//сохранение адреса доставки
	$addressId = getRequest('delivery-address');
	if ($addressId == 'new') {
		$collection = umiObjectsCollection::getInstance();
		$types      = umiObjectTypesCollection::getInstance();
		$typeId     = $types->getBaseType("emarket", "delivery_address");
		$customer   = customer::get();
		$addressId  = $collection->addObject("Address for customer #".$customer->id, $typeId);
		$dataModule = $cmsController->getModule("data");
		if ($dataModule) {
			if (!$dataModule->saveEditedObject($addressId, true, true)) {
				$dataModule->saveEditedObjectWithIgnorePermissions($addressId, true, true); // начиная с версии 2.9.5
			}
		}
		$customer->delivery_addresses = array_merge( $customer->delivery_addresses, array($addressId) );
	}
	$order->delivery_address = $addressId;

	//сохранение способа доставки
	$deliveryId = getRequest('delivery-id');
	if ($deliveryId){
		$delivery = delivery::get($deliveryId);
		$deliveryPrice = (float) $delivery->getDeliveryPrice($order);
		$order->setValue('delivery_id', $deliveryId);
		$order->setValue('delivery_price', $deliveryPrice);
	}

	//сохранение способа оплаты и редирект на итоговую страницу
	$order->setValue('payment_id', getRequest('payment-id'));

	$order->refresh();

	$paymentId = getRequest('payment-id');
	if (!$paymentId) {
		$this->errorNewMessage(getLabel('error-emarket-choose-payment'));
		$this->errorPanic();
	}
	$payment = payment::get($paymentId);

	if ($payment instanceof payment) {
		$paymentName = $payment->getCodeName();
		$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/purchase/payment/{$paymentName}/";
	} else {
		$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/cart/";
	}
	$this->redirect($url);
}

также в папку classes/modules/emarket/ необходимо добавить файл permissions.custom.php следующего содержания:

<?php
$permissions = array('purchasing' => array('deliveryListCustom', 'deliveryAddressesListCustom', 'paymentsListCustom', 'personalInfoCustom', 'saveInfoCustom'));
?>

Необходимо создать шаблон tpls/emarket/delivery/onestep.tpl:

<?php
$FORMS = Array();

$FORMS['delivery_block'] = <<<END
	<h3 class="dost">Выберите подходящий вам способ доставки:</h3>
	<ul>
		%items%
	</ul>
END;

$FORMS['delivery_item_free'] = <<<END
	<li><input type="radio" name="delivery-id" value="%id%" checked="checked" /> %name% - бесплатно</li>
END;

$FORMS['delivery_item_priced'] = <<<END
	<li><input type="radio" name="delivery-id" value="%id%" /> %name% - %price%</li>
END;

$FORMS['delivery_address_block'] = <<<END
	<div class="adrest">
	<h3 class="dost">Выберите подходящий вам адрес доставки:</h3>
		<ul>
			%items%
			<li>
				<input type="radio" name="delivery-address" value="new" /> <b>Новый адрес доставки:</b>
				<table cellspacing="1" cellpadding="1" width="100%" border="0">
					%data getCreateForm(Здесь нужно подставить ид типа данных "Адрес доставки", 'onestep')%
				</table>
			</li>
		</ul>
	</div>
END;

$FORMS['delivery_address_item'] = <<<END
	<li><input type="radio" name="delivery-address" value="%id%" />%index%, %city%, %street%, д. %house%, кв. %flat%</li>
END;

?>

В макросе data getCreateForm(), первый параметр - это id типа данных "Адрес доставки" в модуле "Шаблоны данных", первая вкладка, раздел "Справочники", этот id вы должны для вашей системы определить самостоятельно и подставить в макрос data getCreateForm().

Шаблон tpls/emarket/payment/onestep.tpl:

<?php
$FORMS = Array();

$FORMS['payment_block'] = <<<END
	Выберите подходящий вам способ оплаты:
	<ul>
		%items%
	</ul>
END;

$FORMS['payment_item'] = <<<END
	<li><input type="radio" name="payment-id" value="%id%" /> %name%</li>
END;

?>

Шаблон tpls/data/reflection/onestep.tpl:

<?php

$FORMS = Array();

$FORMS['reflection_block'] = <<<END
%groups%
END;

$FORMS['reflection_group'] = <<<END
	<tr>
		<td colspan="2">
			<br/><br /><b>%title%</b><br /><br />
		</td>
	</tr>
	%fields%
END;

$FORMS['reflection_field_string'] = <<<END
	<tr>
		<td>
			%title%%required_asteriks%:
		</td>

		<td>
			<input type="text" name="%input_name%" value="%value%" class="textinputs" />
		</td>
	</tr>
END;

$FORMS['reflection_field_text'] = <<<END
	<tr>
		<td>
			%title%%required_asteriks%:
		</td>
		<td>
			<textarea name="%input_name%" class="textinputs">%value%</textarea>
		</td>
	</tr>
END;

$FORMS['reflection_field_int'] = <<<END
	<tr>
		<td>
			%title%%required_asteriks%:
		</td>

		<td>
			<input type="text" name="%input_name%" value="%value%" class="textinputs" />
		</td>
	</tr>
END;

$FORMS['reflection_field_relation'] = <<<END
	<tr>
		<td>
			%title%%required_asteriks%:
		</td>

		<td>
			<select name="%input_name%" style="width: 205px" class="textinputs">
				<option />
				%options%
			</select>
		</td>
	</tr>

END;

$FORMS['reflection_field_relation_option'] = <<<END
	<option value="%id%">%name%</option>
END;

$FORMS['reflection_field_relation_option_a'] = <<<END
	<option value="%id%" selected="selected">%name%</option>
END;

?>

В шаблоне tpls/emarket/default.tpl, в блоке order_block, форма должна быть примерно следующая:

<form action="%pre_lang%/emarket/saveInfoCustom/">
	%emarket deliveryListCustom('onestep')%
	%emarket deliveryAddressesListCustom('onestep')%
	<table cellspacing="1" cellpadding="1" width="100%" border="0">
	</table>
	<br/>
	%emarket paymentsListCustom('onestep')%
	<br/>
	<table cellspacing="1" cellpadding="1" width="100%" border="0">
		%emarket personalInfoCustom('onestep')%
	</table>
	<br/>
	<input type="submit" value="Оформить заказ" />
</form>