Корректировка handler1.php

#
Re: Корректировка handler1.php
Никак не работает
#
Re: Корректировка handler1.php
Qualis, вы меня прямо-таки провоцируете сделать это самому, чтобы убедиться
Заказов не беру. Консультирую редко.
#
Re: Корректировка handler1.php
жду результата, мне самому уже интересно )
версия 5.9.0, если что
#
Re: Корректировка handler1.php
Ну что же, Qualis, все-таки неправда ваша. Работает все отлично!
обработчик (на основе типового обработчика для оплаты наличными с демо сайта)

<?php
/* Оплата наличными */
class system_of_pay_handler
{
    /**
     * Метод, запускающий выполнение обработчика
     *
     */
    function Execute()
    {
        /* Обработчик формы оплаты "Оплата при получении" */
        $shop_id = to_int($GLOBALS['shop_id']);

        /* ID платежной системы берем из сессии */
        $system_of_pay_id = to_int($_SESSION['system_of_pay_id']);

        if (class_exists('SiteUsers')) {
            /* Получаем id текущего пользователя сайта */
            $SiteUsers = &singleton('SiteUsers');
            $site_users_id = $SiteUsers->GetCurrentSiteUser();
        } else {
            $site_users_id = false;
        }

        // статус платежа, по умолчанию 0
        $order_row['status_of_pay'] = 0;

        // дата платежа, по умолчанию пустая строка
        $order_row['date_of_pay'] = '';

        $order_row['description'] = to_str($_SESSION['description']);

        // описание и системная информация, по умолчанию пустая строка
        if (to_str($_SESSION['shop_coupon_text']) != '') {
            $order_row['description'] .= "Купон на скидку: " . to_str($_SESSION['shop_coupon_text']) .
                "\n";
        }

        $shop = &singleton('shop');

        if (!isset($_SESSION['last_order_id'])) {
            $_SESSION['last_order_id'] = 0;
        }

        // Если заказ еще не был оформлен
        if ($_SESSION['last_order_id'] == 0) {
            /* Оформляем заказ */
            $order_id = $shop->ProcessOrder($shop_id, $site_users_id, $system_of_pay_id, $order_row);
        } else {
            $order_id = $_SESSION['last_order_id'];
        }

        if ($order_id > 0) {
            if (!class_exists('SiteUsers')) {
                /* Класс пользователей сайта не существует, дописываем информацию о заказчике
                в поле shop_order_description из текущей сессии */
                if ($order_row) {
                    /* Описание заказчика */
                    $order_row['description'] .= "Информация о заказчике:\n" . "Имя: " . to_str($_SESSION['site_users_name']) .
                        "\n" . "Фамилия: " . to_str($_SESSION['site_users_surname']) . "\n" .
                        "Отчество: " . to_str($_SESSION['site_users_patronymic']) . "\n" . "E-Mail: " .
                        to_str($_SESSION['site_users_email']) . "\n" . "Телефон: " . to_str($_SESSION['site_users_phone']) .
                        "\n" . "Факс: " . to_str($_SESSION['site_users_fax']) . "\n" . "Адрес: " .
                        to_str($_SESSION['full_address']) . "\n";

                    /* Дополнительная информация о заказе */
                    $order_row['system_information'] = to_str($_SESSION['system_information']);

                    /* Обязательно добавляем идентификатор! */
                    $order_row['id'] = $order_id;

                    // Обновляем данные о заказе, добавляя в описание данные о заказчике
                    $shop->InsertOrder($order_row);
                }
            }

            $order_row = $shop->GetOrder($order_id);

            /* Формируем XML */
            $xmlData = '<?xml version="1.0" encoding="' . SITE_CODING . '"?>' . "\n";
            $xmlData .= '<document_list>' . "\n";

            /* Ссылка на версию для печати */
            $shop_row = $shop->GetShop($shop_id);
            if ($shop_row) {
                /* Получаем путь к магазину */
                $Structure = &singleton('Structure');
                $shop_path = "/" . $Structure->GetStructurePath($shop_row['structure_id'], 0);
                $shop_path .= "cart/print/{$order_row['shop_order_guid']}/";
                $xmlData .= "<print_link>" . $shop_path . "</print_link>";
            }

            $xmlData .= $shop->GetXmlForOrder($order_id, false, true);
            $xmlData .= $shop->GetXmlForItemsOrder($order_id);            
            $parametres['parent_group_id'] = 0;
            $xmlData .= $shop->GetGroupsXmlTree($shop_id, $parametres);

            $xmlData .= '</document_list>' . "\n";
            
//раскомментируйте следующую строку для отладки
            //echo nl2br(htmlspecialchars($xmlData));


            $xsl = new xsl();
            echo $xsl->build($xmlData, 'ОплатаПриПолучении');

            if ($_SESSION['last_order_id'] == 0) {
                $structure = &singleton('Structure');
                $structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));

                $lib = new lib();
                $LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));

                $date_str = date("d.m.Y H:i:s");

                if (trim(to_str($order_row['shop_order_account_number'])) != '') {
                    $shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
                } else {
                    $shop_order_account_number = $order_id;
                }

                /* Отправляем письмо заказчику */
                $shop->SendMailAboutOrder($shop_id, $order_id, $site_users_id, to_str($LA['xsl_letter_to_admin']),
                    to_str($LA['xsl_letter_to_user']), $order_row['shop_order_users_email'], array('admin-content-type' =>
                    'html', 'user-content-type' => 'html', 'admin-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_admin_subject'],
                    $shop_order_account_number, $shop_row['shop_shops_name'], $date_str),
                    'user-subject' => sprintf($GLOBALS['MSG_shops']['shop_order_user_subject'], $shop_order_account_number,
                    $shop_row['shop_shops_name'], $date_str), 'attach_eitem_file' => 0,
                    'email_from_admin' => $order_row['shop_order_users_email']));
            }

            // Сохраняем ID последнего оформленного заказа ТОЛЬКО ПОСЛЕ ОТПРАВКИ ПИСЬМА
            $_SESSION['last_order_id'] = $order_id;
        } else {
            switch ($order_id) {
                case - 1:
                    {
                        echo "Ошибка вставки заказа в базу данных. Обратитесь к администратору.";
                        break;
                    }
                case - 2:
                    {
                        echo "Ошибка - не найден магазин. Обратитесь к администратору.";
                        break;
                    }
            }
        }
    }

    /**
     * Метод для отображения формы заказа для печати.
     *
     * @param int $order_id идентификатор заказа
     */
    function PrintOrder($order_id)
    {
?>
      <h1>Оплата наличными</h1>
      <p>Платежная система "Оплата наличными" не имеет формы для печати.</p>
      <?php
    }

    /**
     * Изменение статуса заказа. Позволяет пользователю внедрять собственные
     * обработчики при изменении статуса.
     *
     * @param array $param массив атрибутов
     * - $param['shop_order_id'] идентификатор заказа
     * - $param['action'] выполняемое действие над заказом, может принимать значения:
     * edit (редактирование заказа),
     * cancel (отмена заказ),
     * status (изменение статуса заказа),
     * delete (удаление заказа),
     * edit_item (редактирование товара в заказе),
     * delete_item (удаление товара)
     */
    function ChangeStatus($param = array())
    {
        // Если произошло изменение статуса или
        if (isset($param['action']) && in_array($param['action'], array('status', 'edit'))) {
            $shop_order_id = to_int($param['shop_order_id']);

            $shop = &singleton('shop');

            $order_row = $shop->GetOrder($shop_order_id);

            // Получаем информацию о магазине
            $shop_id = to_int($order_row['shop_shops_id']);

            $shop_row = $shop->GetShop($shop_id);

            $structure = &singleton('Structure');
            $structure_row = $structure->GetStructureItem(to_int($shop_row['structure_id']));

            $lib = new lib();
            $LA = $lib->LoadLibPropertiesValue(to_int($structure_row['lib_id']), to_int($structure_row['structure_id']));

            if ($order_row) {
                $DateClass = new DateClass();
                $date_str = $DateClass->datetime_format($order_row['shop_order_date_time']);
            } else {
                $date_str = '';
            }

            // Если предыдущий статус заказа был 1, то меняем тему на подтверждение
            if (to_int($order_row['shop_order_status_of_pay']) == 1) {
                $admin_subject = $GLOBALS['MSG_shops']['shop_order_confirm_admin_subject'];
                $user_subject = $GLOBALS['MSG_shops']['shop_order_confirm_user_subject'];
            } else {
                $admin_subject = $GLOBALS['MSG_shops']['shop_order_admin_subject'];
                $user_subject = $GLOBALS['MSG_shops']['shop_order_user_subject'];
            }

            // Письмо отправляем только при установке статуса активности для заказа
            if (to_int($order_row['shop_order_status_of_pay']) == 1) {
                if (trim(to_str($order_row['shop_order_account_number'])) != '') {
                    $shop_order_account_number = trim(to_str($order_row['shop_order_account_number']));
                } else {
                    $shop_order_account_number = $shop_order_id;
                }

                /* Отправляем письмо заказчику */
                $shop->SendMailAboutOrder($shop_id, $shop_order_id, $order_row['site_users_id'],
                    to_str($LA['xsl_letter_to_admin']), to_str($LA['xsl_letter_to_user']), $order_row['shop_order_users_email'],
                    array('admin-content-type' => 'html', 'user-content-type' => 'html',
                    'admin-subject' => sprintf($admin_subject, $shop_order_account_number, $shop_row['shop_shops_name'],
                    $date_str), 'user-subject' => sprintf($user_subject, $shop_order_account_number,
                    $shop_row['shop_shops_name'], $date_str), 'email_from_admin' => $order_row['shop_order_users_email']));
            }
        }
    }
}
?>


и пример шаблона, использующего получившийся xml:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>

   <xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>

   <!-- ПисьмоАдминистратору -->

   <xsl:template match="/document_list">
      <html>
         <head>
            <style type="text/css">html, body, td
               {
                  font-family: Arial, Verdana, Tahoma, sans-serif;
                  font-size: 10pt;
                  background-color: #FFFFFF;
                  color: #000000;
               }
               
               .td_main
               {
                  border-top: black 1px solid;
                  border-left: black 1px solid;
               }
               
               .td_header
               {
                  border-left: black 1px solid;
                  border-top: black 1px solid;
                  border-bottom: black 1px solid;
                  text-align: center;
                  font-weight: bold;
               }
               
               .td_main_2
               {
                  border-left: black 1px solid;
                  border-bottom: black 1px solid;
               }
            
               .tr_footer td
               {
                  font-size: 11pt;
                  font-weight: bold;
                  white-space: nowrap;
               }
               
               table, td
               {
                  empty-cells: show;
               }</style>
         </head>
         <body bgcolor="#FFFFFF" color="#000000">

            <p>В магазине "<xsl:value-of select="order_list/shop/shop_name"/>" был оформлен <b>заказ № <xsl:value-of select="order_list/order_account_number"/></b>.</p>

            <xsl:apply-templates select="order_list"/>

            <br/>

            <xsl:choose>
               <xsl:when test="count(items_order) &gt; 0">
                  <table cellpadding="3" cellspacing="0" width="100%">
                     <tr>
                        <td class="td_header">Номер</td>
                        <td class="td_header">Артикул</td>
                        <td class="td_header">Наименование</td>
                        <td class="td_header">Группа</td>
                        <td class="td_header">Кол-во</td>
                        <td class="td_header">Цена</td>
                        <td class="td_header" style="border-right: black 1px solid;">Сумма</td>
                     </tr>
                     <xsl:apply-templates select="items_order"/>
                     <tr class="tr_footer">
                        <td colspan="5" align="right">
                           <b>Итого:</b>
                        </td>
                        <td style="white-space: nowrap">
                           <xsl:value-of select="format-number(order_list/sum, '### ###,00', 'my')"/>&#xA0;<xsl:value-of select="order_list/currency/currency_name" disable-output-escaping="yes"/></td>
                     </tr>
                  </table>
               </xsl:when>
               <xsl:otherwise>
                  <p>
                     <b>Заказанных товаров нет</b>
                  </p>
               </xsl:otherwise>
            </xsl:choose>

            <xsl:if test="count(shop_eitems/shop_eitem) &gt; 0">
               <br/>
               <br/>
               <b>Данные об электронных товарах:</b>
               <br/>
               <div style="background-color: #eee; padding: 10px;">
                  <xsl:apply-templates select="shop_eitems/shop_eitem"/>
               </div>
            </xsl:if>

            <p>
               <hr/>Система управления сайтом HostCMS
               <br/>
               <a href="http://www.hostcms.ru">http://www.hostcms.ru</a>
            </p>
         </body>
      </html>
   </xsl:template>

   <!-- Шаблон вывода данных о заказе -->
   <xsl:template match="order_list">

      <p>
         <xsl:if test="site_users_company != ''">Компания: <xsl:value-of select="site_users_company"/><br/></xsl:if>ФИО: <xsl:value-of select="site_user_fio"/><br/>
         
         E-mail: <xsl:value-of select="site_users_email"/><br/>

         <xsl:if test="site_users_phone != ''">Телефон: <xsl:value-of select="site_users_phone"/><br/></xsl:if>
         <xsl:if test="site_users_fax != ''">Факс: <xsl:value-of select="site_users_fax"/><br/></xsl:if>Адрес:
         <xsl:if test="index != ''">
            <xsl:value-of select="index"/>
            <xsl:text>, </xsl:text>
         </xsl:if>
         <xsl:if test="country_name != ''">
            <xsl:value-of select="country_name"/>
            <xsl:text>, </xsl:text>
         </xsl:if>
         <xsl:if test="location_name != ''">
            <xsl:value-of select="location_name"/>
            <xsl:text>, </xsl:text>
         </xsl:if>
         <xsl:if test="city_name != ''">
            <xsl:value-of select="city_name"/>
            <xsl:text>, </xsl:text>
         </xsl:if>
         <xsl:if test="city_area_name != ''">
            <xsl:value-of select="city_area_name"/>
            <xsl:text>, </xsl:text>
         </xsl:if>
         <xsl:if test="address != ''">
            <xsl:value-of select="address"/>
         </xsl:if>

         <br/>

         <xsl:if test="delivery_type/type_of_delivery_description != ''">Тип доставки: <xsl:value-of select="delivery_type/type_of_delivery_description"/><br/></xsl:if>

         <xsl:if test="system_of_pay_description != ''">Способ оплаты: <xsl:value-of select="system_of_pay_name"/><br/></xsl:if>Статус оплаты: <b><xsl:choose>
               <xsl:when test="status_of_pay = '1'">оплачено</xsl:when>
               <xsl:otherwise>не оплачено</xsl:otherwise></xsl:choose></b>

         <br/>

         <xsl:if test="shop_order_description != ''">Описание заказа: <xsl:value-of select="shop_order_description" disable-output-escaping="yes"/><br/></xsl:if>

         <xsl:if test="shop_order_system_information != ''">Системная информация: <xsl:value-of select="shop_order_system_information" disable-output-escaping="yes"/><br/></xsl:if>
      </p>
   </xsl:template>

   <!-- Данные о товарах -->
   <xsl:template match="items_order">
      <tr>
         <td class="td_main_2">
            <xsl:value-of select="position()"/>
         </td>
         <td class="td_main_2">
            <xsl:choose>
               <xsl:when test="order_items_marking != ''">
                  <xsl:value-of select="order_items_marking"/>
               </xsl:when>
               <xsl:otherwise>&#x97;</xsl:otherwise>
            </xsl:choose>
         </td>
         <td class="td_main_2">
            <xsl:value-of select="order_items_name"/>
         </td>
         <td class="td_main_2">
            <xsl:choose>
               <xsl:when test="item/node()">
                  <xsl:variable name="parent_group_id" select="item/@group"/>
                  <xsl:value-of select="//group[@id = $parent_group_id]/name"/>
               </xsl:when>
               <xsl:otherwise>
                  <xsl:text disable-output-escaping="yes">&#xA0;</xsl:text>
               </xsl:otherwise>
            </xsl:choose>
         </td>

         <td class="td_main_2" style="white-space: nowrap">
            <xsl:value-of select="order_items_quantity"/>
            <xsl:text> </xsl:text>
            <xsl:value-of select="item/mesure"/>
         </td>
         <td class="td_main_2" style="white-space: nowrap">
            <xsl:value-of select="format-number(order_items_price, '### ###,00', 'my')"/>&#xA0;<xsl:value-of select="/document_list/order_list/currency/currency_name" disable-output-escaping="yes"/></td>
         <td class="td_main_2" style="border-right: black 1px solid; white-space: nowrap">
            <xsl:value-of select="format-number(order_items_quantity * order_items_price, '### ###,00', 'my')"/>&#xA0;<xsl:value-of select="/document_list/order_list/currency/currency_name" disable-output-escaping="yes"/></td>
      </tr>
   </xsl:template>

   <!-- Данные о товарах -->
   <xsl:template match="shop_eitem">
      <b>
         <i>
            <xsl:value-of select="shop_eitem_name"/>
         </i>
      </b>
      <br/>
      <xsl:if test="shop_eitem_value != '' and /document_list/order_list/shop/shop_shops_attach_eitem = 1">
         <i>Текст электронного товара:</i>
         <br/>
         <xsl:value-of select="shop_eitem_value"/>
         <br/>
      </xsl:if>

      <!-- Отображать ли ссылку на файл электронного товара-->
      <xsl:if test="/document_list/order_list/shop/shop_shops_attach_eitem = 0 and shop_eitem_resource != ''">
         <a href="http://{/document_list/order_list/shop/site_alias_name}{/document_list/order_list/shop/shop_path}?download_file={shop_eitem_resource}">
            <i>Скачать файл</i>
         </a>
         <br/>
      </xsl:if>

      <xsl:if test="shop_eitem_filename != ''">
         <i>Файл электронного товара:</i>
         <br/>
         <xsl:value-of select="shop_eitem_filename"/>
         <br/>
      </xsl:if>
      <br/>
   </xsl:template>
</xsl:stylesheet>


Версия 5.9.2, хотя вряд-ли это имеет значение.
Заказов не беру. Консультирую редко.
#
Re: Корректировка handler1.php
Ну и парочка картинок для пруфинга:

http://floomby.ru/content/RymTkDL5kC/ - отладочный вывод XML для писем администратору и клиенту на тестовой площадке. По характерным признакам можно определить, что группы в этом XML таки есть - специально выложил скриншот именно с концом xml-документа

http://floomby.ru/content/HnuuL8wbZ0/ - результат обработки генерируемого xml с помощью выложенного здесь XSL-шаблона в Stylus Studio. Тут видно и что группы в xml есть (см. правую часть скриншота), и что в письме присутствует название группы товара (внизу слева).

P.S. На тестовую площадку шаблон не выкладывал - у меня оттуда почта на чужие домены не ходит, а создать ящик на самом домене мне все как-то недосуг, да и ненадо.
Заказов не беру. Консультирую редко.
#
Re: Корректировка handler1.php
Вы знаете, коллега, но у меня не работает.
Вероятно потому что у меня поцесс оформления заказа состоит из одного шага, т.е. Корзина > Уведомление.
Как руки доберутся буду копать, что где пропустил в типовой.
#
Re: Корректировка handler1.php
ну копайте
Заказов не беру. Консультирую редко.
Авторизация