Заказ в один шаг и отправка письма о заказе пользователю

Записано по мотивам обсуждений на форуме и конечно же, реальных требований заказчика к работе и функционалу интернет-магазина. Заказ в один шаг, который, собственно, как правило и требуется в магазинах, обсуждался здесь. У меня в итоге получился следующий код в пользовательском файле обработки заказа (__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;

?>
Поделиться с друзьями:

Комментарии

Ответ..

Довольно интересная статья. У себя в ЖЖ блоге я немного хочу процитировать Ваш пост. Разумеется, ссылка на Ваш сайт будет присутствовать. Надеюсь Вы не против?

bash

xxx: Оказалось, не так страшна найденная в доставшейся в наследство библиотеке книжка "Мир Лиспа"...xxx: ...как дарственная надпись "Мариночка, поздравляем тебя с 14-летием!" на её обложке