Skip to content

Instantly share code, notes, and snippets.

@dkhorev

dkhorev/dkdev.mail.md

Last active Mar 19, 2021
Embed
What would you like to do?
Инструкция по расширению модуля dkdev.mail для Bitrix

Инструкция по расширению модуля dkdev.mail для Bitrix

Можно расширить функционал, добавив в корень модуля файлы addon_options.php (для админки) и addon_include.php (для рантайма). Эти изменения сохранится при обновлении базового модуля.

В файле addon_options.php нужно определить метод showAddonTab() который отвечает за рендер содержимого карточки.

В файле addon_include.php можно произвести любые действия и записать их в массив $result. Все содержимое этого массива будет включено в макросы письма.

Пример addon_options.php #1

<?php if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

function showAddonTab() {
    global $arSites, $APPLICATION, $module_id;

    $site = $arSites[0]["LID"];

    $orderId = GetTestOrder('TEST_ORDER_ID_' . $site, $site);

    /* @var $result */
    if (file_exists($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/" . $module_id . "/addon_include.php")) {
        include($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/" . $module_id . "/addon_include.php");
    }

	?>
    Макрос #BASKET_RAIMENTS# (превью)
    <tr>
        <td>
            <?
            echo $result['BASKET_RAIMENTS'];
            ?>
        </td>
    </tr>
    <?
}

Пример addon_include.php #1

<?php
global $site;

if ($orderId && !$isAdmin) {
    $result = [];
    $result['BASKET_RAIMENTS'] = (new dkdev_extmail)::doCartMerged($orderId, 's1', ['PRICE', 'PRICE_ONE']);
}

Пример addon_options.php #2

<?php

function showAddonTab(){
	global $module_id;
	
	CModule::IncludeModule("iblock");
	
	$orderId = COption::GetOptionInt($module_id,'TEST_ORDER_ID');
	
	if ($orderId) {		
		$cart = '';
		try
		{
			$cartObj = new dkdev_extmail;
			$cart = $cartObj->runCustomAddon($orderId, true);
		}
		catch (SystemException $e)
		{
			echo 'Exception: ',  $e->getMessage(), "<br>";
		}
		
	}
	else
	{
		echo GetMessage("DKDEV_MAIL_UKAJITE_NOMER_TESTOV");
	}
}

Пример addon_include.php #2

<?php

$arrOrder = CSaleOrder::GetByID($orderId);

if (!is_array($arrOrder))
	return 'error';
	
$orderCurrency = $arrOrder['CURRENCY'];

$arBasketList = array();
$dbBasketItems = CSaleBasket::GetList(
		$arOrder,
		array("ORDER_ID" => $orderId),
		false,
		false,
		array("ID", "PRODUCT_ID", "NAME", "QUANTITY", "PRICE")
	);
	
while ($arItem = $dbBasketItems->Fetch())
	$arBasketList[] = $arItem;

//BASKET LONG
//[pd4453-02] Item name (3000х1);
$temp_item_long = '[%SKU%] %NAME% (%PRICE%x%QUANTITY%);';
$temp_order_long = '%ITEMS% Сумма %PRICE_TOTAL%';
//BASKET LONG

//BASKET SHORT
//[pd4453-02] (3000х1); [900220] (790х2) Сумма 4580 руб
$temp_item_short = '[%SKU%] (%PRICE%x%QUANTITY%);';
$temp_order_short = '%ITEMS% Сумма %PRICE_TOTAL%';
//BASKET SHORT

$result = 'none';
$all_items_long = '';
$all_items_short = '';

foreach ($arBasketList as $arItem)
{
	$this_item_long = $temp_item_long;
	$this_item_short = $temp_item_short;
	
	$arItemProps = CIBlockElement::GetByID($arItem["PRODUCT_ID"]);
	$arItemProps = $arItemProps->GetNextElement();
	$ar_res = $arItemProps->GetProperty('ARTNUMBER'); //ARTNUMBER код артикула в шаблоне клиента
	$sku = trim($ar_res['VALUE']);
	
	$this_item_long = str_replace('%PRICE%', round($arItem['PRICE']), $this_item_long);
	$this_item_long = str_replace('%QUANTITY%', round($arItem['QUANTITY']), $this_item_long);
	$this_item_long = str_replace('%NAME%', $arItem['NAME'], $this_item_long);
	$this_item_long = str_replace('%SKU%', $sku, $this_item_long);
	
	$this_item_short = str_replace('%PRICE%', round($arItem['PRICE']), $this_item_short);
	$this_item_short = str_replace('%QUANTITY%', round($arItem['QUANTITY']), $this_item_short);
	$this_item_short = str_replace('%NAME%', $arItem['NAME'], $this_item_short);
	$this_item_short = str_replace('%SKU%', $sku, $this_item_short);
	
	$all_items_long .= $this_item_long;
	$all_items_short .= $this_item_short;
}

$temp_order_long = str_replace('%ITEMS%', $all_items_long, $temp_order_long);
$temp_order_long = str_replace('%PRICE_TOTAL%', SaleFormatCurrency($arrOrder['PRICE'], $orderCurrency), $temp_order_long);

$temp_order_short = str_replace('%ITEMS%', $all_items_short, $temp_order_short);
$temp_order_short = str_replace('%PRICE_TOTAL%', SaleFormatCurrency($arrOrder['PRICE'], $orderCurrency), $temp_order_short);

if($isAdmin)
{
	echo '<b>#BASKET_LONG#</b><br>', $temp_order_long, '<br><br>';
	echo '<b>#BASKET_SHORT#</b><br> ', $temp_order_short;
}
else
{
	$result = [];
	$result["BASKET_LONG"] = $temp_order_long;
	$result["BASKET_SHORT"] = $temp_order_short;
}

Свои макросы корзины

Пример добавления в корзину 3-х полей на стандартном магазине.

addon_options.php

<?php

if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
    die();
}

function showAddonTab()
{
    global $arSites, $module_id;

    $site = $arSites[0]["LID"];

    $orderId = GetTestOrder('TEST_ORDER_ID_' . $site, $site);

    /* @var $result */
    if (file_exists($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/" . $module_id . "/addon_include.php")) {
        include($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/" . $module_id . "/addon_include.php");
    }

    ?>
  Макрос #BASKET_MANAGER# (превью)
  <tr>
    <td>
        <?php
        echo $result['BASKET_MANAGER'];
        ?>
    </td>
  </tr>
    <?php
}

addon_include.php

<?php

/** @var string $orderId */

if ($orderId) {
    $result = [];
    $result['BASKET_MANAGER'] = $cart = dkdev_extmail::doCartMerged($orderId, 's1', [], [
        'itemProps' => [
            'override' => false,
            'fields'   => [
                '10',
                'DISCOUNT_PRICE',
                '32',
            ],
            'names'    => [
                'Прозводитель',
                'Скидка',
                'Артикул',
            ],
        ],
    ]);
}
override
	false - добавить поля в конец корзины которая уже генерится для клиентов
	true - полностью создать корзину с новыми полями
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment