Кнопка «повторить заказ» для Битрикс

Кнопка

Здравствуйте, сегодня я расскажу о том, как добавить в административный раздел сайта на Битриксе кнопку «Повторить заказ», при нажатии на которую менеджер магазина может быстро повторить уже сделанный заказ на сайте. Суть в том, что иногда такая кнопка бывает очень удобна, например, когда пользователь уже делал заказ в вашем интернет-магазине, перезванивает вам и просит повторить его заказ.
Увидеть данную кнопку вы сможете при просмотре детальной информации о заказе, который нужно повторить (см. картинку).

Отправка сообщения пользователю при смене статуса его заказа Битрикс

При реализации нам надо добавить код в два файла. Сначала откроем файл /bitrix/modules/sale/admin/order_detail.php, найдем там следующий код:

$aMenu[] = array(
		"TEXT" => GetMessage("SOD_TO_PRINT"),
		"LINK" => "/bitrix/admin/sale_order_print.php?ID=".$ID."&lang=".LANGUAGE_ID.GetFilterParams("filter_"),

	);

И перед ним вставим свою кнопку, чтобы получилось так:

$aMenu[] = array(
		"TEXT" => "Повторить",
		"LINK" => "/bitrix/admin/sale_order.php?ID=".$ID."&action=REPEAT",

	);

$aMenu[] = array(
		"TEXT" => GetMessage("SOD_TO_PRINT"),
		"LINK" => "/bitrix/admin/sale_order_print.php?ID=".$ID."&lang=".LANGUAGE_ID.GetFilterParams("filter_"),

	);

Сохраняем файл и открываем следующий, он лежит по адресу /bitrix/modules/sale/admin/order.php. И в самое начало файла, сразу после строчки «IncludeModuleLangFile(__FILE__);», добавляем наш код:

// Повторяем заказ
if ($_GET["action"] == "REPEAT")
 {
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/catalog/include.php");

    $arOrder = CSaleOrder::GetByID($_GET["ID"]);

        $arFields = array(
             "LID" => $arOrder["LID"],
             "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"],
             "PAYED" => "N",
             "CANCELED" => "N",
             "STATUS_ID" => "N",
             "PRICE_DELIVERY" => $arOrder["PRICE_DELIVERY"],
             "ALLOW_DELIVERY" => "N",
             "PRICE" => $arOrder["PRICE"],
             "CURRENCY" => $arOrder["CURRENCY"],
             "DISCOUNT_VALUE" => $arOrder["DISCOUNT_VALUE"],
             "USER_ID" => $arOrder["USER_ID"],
             "PAY_SYSTEM_ID" => $arOrder["PAY_SYSTEM_ID"],
             "DELIVERY_ID" => $arOrder["DELIVERY_ID"],
             "USER_DESCRIPTION" => $arOrder["USER_DESCRIPTION"],
             "TAX_VALUE" => $arOrder["TAX_VALUE"]
);
$s = CSaleOrder::Add($arFields);

$db_props = CSaleOrderPropsValue::GetOrderProps($_GET["ID"]);

while ($arProps = $db_props->Fetch())
{
     CSaleOrderPropsValue::Add(array("CODE"=>$arProps["CODE"], "ORDER_ID"=>$s,"ORDER_PROPS_ID"=>$arProps["ORDER_PROPS_ID"],"NAME"=>$arProps["NAME"], "VALUE"=>$arProps["VALUE"]));
}

CSaleBasket::DeleteAll($_SESSION["SALE_USER_ID"], False);

$dbItemsInOrder = CSaleBasket::GetList(array("ID" => "ASC"), array("ORDER_ID" => $_GET["ID"]));

while ($ItemsInOrder = $dbItemsInOrder->Fetch())
{

$arFields_1 = array(
    "PRODUCT_ID" => $ItemsInOrder["PRODUCT_ID"],
    "PRODUCT_PRICE_ID" => $ItemsInOrder["PRODUCT_PRICE_ID"],
    "PRICE" => $ItemsInOrder["PRICE"],
    "CURRENCY" => $ItemsInOrder["CURRENCY"],
    "WEIGHT" => $ItemsInOrder["WEIGHT"],
    "QUANTITY" => $ItemsInOrder["QUANTITY"],
    "LID" => $ItemsInOrder["LID"],
    "DELAY" => "N",
    "CAN_BUY" => "Y",
    "NAME" => $ItemsInOrder["NAME"],
    "CALLBACK_FUNC" => $ItemsInOrder["CALLBACK_FUNC"],
    "MODULE" => $ItemsInOrder["MODULE"],
    "NOTES" => $ItemsInOrder["NOTES"],
    "ORDER_CALLBACK_FUNC" => $ItemsInOrder["ORDER_CALLBACK_FUNC"],
    "DETAIL_PAGE_URL" => $ItemsInOrder["DETAIL_PAGE_URL"],
    "CANCEL_CALLBACK_FUNC" => $ItemsInOrder["CANCEL_CALLBACK_FUNC"],
    "PAY_CALLBACK_FUNC" => $ItemsInOrder["PAY_CALLBACK_FUNC"]
  );

CSaleBasket::Add($arFields_1);
}

CSaleBasket::OrderBasket($s, $_SESSION["SALE_USER_ID"], $arOrder["LID"]);

CSaleBasket::DeleteAll($_SESSION["SALE_USER_ID"], False);
 }

Если товар, который есть в повторяемом заказе, отсутствует на сайте, он просто не добавится к новому заказу. Сразу оговорюсь, что функционал данной кнопки может затереться при обновлении Битрикса, чтобы такого не было надо создать свои файлы order.php и order_detail.php. Скажем order_custom.php и order_detail_custom.php. И сделать так, чтобы ссылка из файлов sale_order_detail.php и sale_order.php, лежащих в папке /bitrix/admin/ вела на них.

Похожие посты:
  • Самостоятельное присвоение аффилиатов к заказам (Битрикс)
  • Отправка письма на почту пользователю при оформлении нового заказа (Битрикс)
  • Отправка письма пользователю при смене статуса заказа (Битрикс)
  • События в 1С Битрикс
  • Выгрузка заказов в xml файл для курьерской службы
  • 4 комментария: Кнопка «повторить заказ» для Битрикс

    1. В строке
      >> CSaleBasket::OrderBasket($s, $_SESSION["SALE_USER_ID"], s1);
      последний параметр надо убрать совсем или, лучше, установить равным $arOrder["LID"].

      • Лаврушин Алексей

        Да, вы правы. Поправил, иначе это не у всех могло работать, спасибо.

    2. Спасибо, полезная статья!

    3. Отличная статья!

      Было бы более правильно в плане совместимости с обновлениями API Битрикса не дублировать весь массив, а просто удалить лишние элементы из него:

      $dbItemsInOrder = CSaleBasket::GetList(array(«ID» => «ASC»), array(«ORDER_ID» => intval($_REQUEST["ID"])));
      while($arItemInOrder=$dbItemsInOrder->Fetch()) {
      unset($arItemInOrder['FUSER_ID']);
      unset($arItemInOrder['ORDER_ID']);
      unset($arItemInOrder['ID']);
      unset($arItemInOrder['DATE_INSERT']);
      unset($arItemInOrder['DATE_UPDATE']);
      CSaleBasket::Add($arItemInOrder);
      }

    Добавить комментарий для Kola
    Отменить ответ

    Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: