Записано по мотивам обсуждений на форуме и конечно же, реальных требований заказчика к работе и функционалу интернет-магазина. Заказ в один шаг, который, собственно, как правило и требуется в магазинах, обсуждался здесь. У меня в итоге получился следующий код в пользовательском файле обработки заказа (__custom.php):
<?php
abstract class __emarket_custom {
//TODO: Write here your own macroses
public function fast_purchasing_xslt(){
$order = $this->getBasketOrder();
$orderId = $order->id;
$customer = selector::get('object')->id( $order->customer_id );
$result = array(
'attribute:id' => ($orderId),
'xlink:href' => ('uobject://' . $orderId));
if(!permissionsCollection::getInstance()->isAuth()){
$result['customer'] = array('full:object' => $customer);
}
$result['delivery'] = $this->customerDeliveryList('notemplate');
$result['delivery_choose'] = $this->renderDeliveryList($order, 'notemplate');
return $result;
}
public function saveinfo(){
$order = $this->getBasketOrder(false);
//сохранение регистрационных данных
$cmsController = cmsController::getInstance();
$data = $cmsController->getModule('data');
$data->saveEditedObject(customer::get()->id, false, true);
//сохранение способа доставки
$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);
}
//сохранение адреса доставки
if($deliveryId != 446) {
$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);
$address = $collection->getObject($addressId);
$dataModule = $cmsController->getModule("data");
if($dataModule) {
$dataModule->saveEditedObject($addressId, true, true);
}
$em = $address->getValue( 'email' );
$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);
$xslTemplater = xslTemplater::getInstance();
$xslInited = $xslTemplater->setIsInited(false);
list($template) = def_module::loadTemplates("emarket/mail/default.tpl", "myneworder_notification");
try {
$payment = payment::get($order->payment_id);
$paymentName = $payment->name;
$paymentStatus = order::getCodeByStatus($order->getPaymentStatus());
} catch(coreException $e) {
$paymentName = "";
$paymentStatus = "";
}
$content = def_module::parseTemplateForMail($template, array(
"order_id" => $order->id,
"order_name" => $order->name,
"order_number" => $order->number,
"payment_type" => $paymentName,
"payment_status" => $order->status,
"price" => $order->getActualPrice()
// ,
// "new_data" => $delivery_address_city
));
$langs = cmsController::getInstance()->langs;
// Параметр конструктора - шаблон письма. По-умолчанию, "default"
$mail = new umiMail();
$domains = domainsCollection::getInstance();
$domainId = $cmsController->getCurrentDomain()->getId();
$defaultDomainId = $domains->getDefaultDomain()->getId();
$regedit = regedit::getInstance();
if ($regedit->getVal("//modules/emarket/from-email/{$domainId}")) {
$fromMail = $regedit->getVal("//modules/emarket/from-email/{$domainId}");
$fromName = $regedit->getVal("//modules/emarket/from-name/{$domainId}");
} elseif ($regedit->getVal("//modules/emarket/from-email/{$defaultDomainId}")) {
$fromMail = $regedit->getVal("//modules/emarket/from-email/{$defaultDomainId}");
$fromName = $regedit->getVal("//modules/emarket/from-name/{$defaultDomainId}");
} else {
$fromMail = $regedit->getVal("//modules/emarket/from-email");
$fromName = $regedit->getVal("//modules/emarket/from-name");
}
$mail->setFrom($fromMail, $fromName);
$mail->setSubject($langs['notification-client-neworder-subject']);
$mail->setPriorityLevel('highest');
$customer = umiObjectsCollection::getInstance()->getObject($order->getCustomerId());
if ( !empty($em) )
{
$name = $customer->lname . " " .$customer->fname . " " . $customer->father_name;
$mail->setContent($content);
$mail->addRecipient($em, $name);
$mail->commit();
$res = $mail->send();
}
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);
}
public function onStatusChangedDomain(iUmiEventPoint $event) {
// тут отправка менеджеру
if($event->getMode() == "after" &&
$event->getParam("old-status-id") != $event->getParam("new-status-id")) {
$order = $event->getRef("order");
$statusId = $order->getValue("status_id");
$codeName = order::getCodeByStatus($statusId);
if($codeName != 'waiting') return;
$regedit = regedit::getInstance();
$domain_name = $order->domain_id;
$domain_id = domainsCollection::getInstance()->getDomainId($domain_name);
$cmsController = cmsController::getInstance();
$domains = domainsCollection::getInstance();
$domainId = $cmsController->getCurrentDomain()->getId();
$defaultDomainId = $domains->getDefaultDomain()->getId();
$mail_arr = array();
// Индекс элемента массива должен быть равен id домена
$mail_arr['1'] = array('admin@mysite.ru');
$xslTemplater = xslTemplater::getInstance();
$xslInited = $xslTemplater->setIsInited(false);
list($template) = def_module::loadTemplates("tpls/emarket/mail/default.tpl", "neworder_notification");
try {
$payment = payment::get($order->payment_id);
$paymentName = $payment->name;
$paymentStatus = order::getCodeByStatus($order->getPaymentStatus());
} catch(coreException $e) {
$paymentName = "";
$paymentStatus = "";
}
$content = def_module::parseTemplate($template, array("order_id" => $order->id,
"order_name" => $order->name,
"order_number" => $order->number,
"payment_type" => $paymentName,
"payment_status" => $paymentStatus,
"price" => $order->getActualPrice(),
));
$langs = $cmsController->langs;
foreach($mail_arr[$domain_id] as $email){
$letter = new umiMail();
$letter->addRecipient($email);
if ($regedit->getVal("//modules/emarket/from-email/{$domainId}")) {
$fromMail = $regedit->getVal("//modules/emarket/from-email/{$domainId}");
$fromName = $regedit->getVal("//modules/emarket/from-name/{$domainId}");
} elseif ($regedit->getVal("//modules/emarket/from-email/{$defaultDomainId}")) {
$fromMail = $regedit->getVal("//modules/emarket/from-email/{$defaultDomainId}");
$fromName = $regedit->getVal("//modules/emarket/from-name/{$defaultDomainId}");
} else {
$fromMail = $regedit->getVal("//modules/emarket/from-email");
$fromName = $regedit->getVal("//modules/emarket/from-name");
}
$letter->setFrom($fromMail, $fromName);
$letter->setSubject($langs['notification-neworder-subject'] . " (#{$order->number})");
$letter->setContent($content);
$letter->commit();
$letter->send();
$xslTemplater->setIsInited($xslInited);
}
}
}
};
?>
Файл /tpls/emarket/mail/default.tpl (основной шаблон письма)
<?php
$FORMS = Array();
$FORMS['status_notification'] = <<<END
Ваш заказ #%order_number% %status%
<br><br>
Посмотреть историю заказов вы можете в своем <a href="http://%domain%/emarket/personal/">личном кабинете</a>.
END;
$FORMS['status_notification_receipt'] = <<<br>
Посмотреть историю заказов вы можете в своем <a href="http://%domain%/emarket/personal/">личном кабинете</a>.
<br><br>
Квитанцию на оплату вы можете получить, перейдя по <a href="http://%domain%/emarket/receipt/%order_id%/%receipt_signature%/">этой ссылке</a>.
END;
$FORMS['neworder_notification'] = <<Просмотр)
<br><br>
Способ оплаты: %payment_type%<br>
Статус оплаты: %payment_status%<br>
Сумма оплаты: %price%<br>
END;
$FORMS['myneworder_notification'] = <<<br>
<!--
Способ оплаты: %payment_type%<br/>
Сумма оплаты: %price%<br/><br/>
-->
%emarket order(%order_id%, 'email')%
Спасибо за Ваш заказ! В ближайшее время менеджер свяжется с Вами.
END;
?>
Файлы /tpls/emarket/email.tpl и /tpls/emarket/customer/email.tpl должны содержать следующий код:
<?php
$FORMS = array();
$FORMS['price_block'] = <<<END
<h5>Вывод цены</h5>
%price-original%
%price-actual%
%emarket discountInfo(%discount_id%)%
%currency-prices%
END;
$FORMS['price_original'] = <<<END
<!-- %currency_name% -->
<p>
<strike>%prefix% %original% %suffix%</strike>
</p>
END;
$FORMS['price_actual'] = <<<END
<!-- %currency_name% -->
%prefix% %actual% %suffix%
END;
$FORMS['order_block'] = <<<END
<h4>Информация о покупателе</h4>
%emarket getCustomerInfo()%
<h4>Список покупок</h4>
<table>
<thead>
<tr>
<th>#</th>
<th>Наименования</th>
<th>Дополнительные опции</th>
<th>Количество</th>
<th>Цена за ед.</th>
<th>Цена</th>
<th>Скидки</th>
</tr>
</thead>
<tbody>
%items%
</tbody>
</table>
<h4>Скидка на заказ</h4>
%emarket discountInfo(%discount_id%)%
<h4>Доставка</h4>
%delivery-price%
<h4>Итого:</h4>
%total-price%
<p>
Товаров в корзине: %total-amount%
</p>
END;
$FORMS['order_item'] = <<<END
<tr>
<td>
#
</td>
<td>
<a href="%link%">%name%</a>
</td>
<td>
%options%
</td>
<td>
%amount%
</td>
<td>
%price%
</td>
<td>
%total-price%
</td>
<td>
%emarket discountInfo(%discount_id%)%
</td>
</tr>
END;
$FORMS['options_block'] = <<<END
%items%
END;
$FORMS['options_block_empty'] = "---";
$FORMS['options_item'] = <<<END
%name% +%price%%list-comma%
END;
$FORMS['order_block_empty'] = <<<END
<p>Корзина пуста</p>
END;
$FORMS['purchase'] = <<<END
%purchasing%
%emarket ordersList()%
END;
$FORMS['orders_block'] = <<<END
<p>Список ваших заказов:</p>
<ul>
%items%
</ul>
END;
$FORMS['orders_block_empty'] = <<<END
<p>Заказов нет</p>
END;
$FORMS['orders_item'] = <<<END
<li>%name% (%id%)</li>
END;
$FORMS['purchase_successful'] = <<<END
<p>Заказ успешно добавлен</p>
END;
$FORMS['purchase_failed'] = <<<END
<p>Не удалось добавить заказ</p>
END;
$FORMS['personal'] = <<<END
%emarket ordersList()%
END;
?>
Комментарии
Ответ..
Vladislav-Pypea..., 27 мая 2013 at about 19:20.Довольно интересная статья. У себя в ЖЖ блоге я немного хочу процитировать Ваш пост. Разумеется, ссылка на Ваш сайт будет присутствовать. Надеюсь Вы не против?
bash
Erydayorgatty, 17 Июн 2013 at about 23:49.xxx: Оказалось, не так страшна найденная в доставшейся в наследство библиотеке книжка "Мир Лиспа"...xxx: ...как дарственная надпись "Мариночка, поздравляем тебя с 14-летием!" на её обложке