За основу взяли готовый вариант счета из платежного модуля оплаты счета один к одному, скажем так, но не взлетело! Ведь там есть настройки платежной системы перед формированием счета, а у нас и оплаты с такой системой в заказе может и не быть.
Тогда для оживления счета были внесены некоторые изменения в код:
Конечно же были подключены нужные модули системы
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule('highloadblock');
CModule::IncludeModule('sale');
Далее ORDER_ID нужно получить из запроса, а не из сессии
$ORDER_ID = IntVal($_REQUEST["ORDERID"]);
Далее мы не хотим показывать чужие счета ХЗ кому, кроме админа, конечно
global $USER;
if ($arOrder["USER_ID"]!=$USER->GetID()&&$USER->GetID()>1)die();
Теперь нужно проинитить платежную систему с помощью
CSalePaySystemAction::InitParamArrays
Но! У нас нет нужной оплаты с системой формирования счета в заказе! Пришлось позаимствовать настройки оплаты у старого заказа, где оплата такая была
$filter = array('ID' => 20293);//оплата с нужной системой
$resPayment = \Bitrix\Sale\Internals\PaymentTable::getList(array(
'select' => array('PAY_SYSTEM_ID', 'SUM', 'DATE_BILL', 'ID'),
'filter' => $filter,
'limit' => array(1)
));
$payment = $resPayment->fetch();
$dbPaySysAction = CSalePaySystemAction::GetList(
array(),
array(
"PAY_SYSTEM_ID" => 3,//код нашей системы оплаты
"PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"]
),
false,
false,
array("ACTION_FILE", "PARAMS", "ENCODING")
);
if ($arPaySysAction = $dbPaySysAction->Fetch()){
CSalePaySystemAction::InitParamArrays($arOrder, $ORDER_ID, $arPaySysAction["PARAMS"],array(),$payment);
}
Инит прошел успешно. Далее просто выгоняем счет. Я взял его в буфер, т.к. мне нужно потом его передать в mPDF. Кста, в Битре есть свой PDF-креатор, но, простите, адище. Пользоваться им у меня никакого желания нет. А вот вогнать html код в pdf — есть )
ob_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Счет</title>
...
</body>
</html>
<?php
$html=ob_get_clean();
Полученный html загоняем в mPDF
require_once "mpdf/mpdf.php";
$mpdf=new mPDF();
$mpdf->WriteHTML($html);
$mpdf->SetTitle("Счет по заказу $ORDER_ID");
$mpdf->Output("invoice-$ORDER_ID.pdf","D");
И, думаете все?! Да хрен бы я писать тогда стал!
На выходе «??????????»! Вот же засада! А помните тот самый ужасный mbstring.func_overload? Так вот mPDF просит mbstring.func_overload 0, а Битр 2, кажись. Итого UTF не UTF. Декоды и танцы с iconv или mb_ не дают результата или вешают апач вовсе.
Недолгие поиски привели к решению, но только для VDSников, т.к. нужно править конфиг апча, а именно для папки с mPDF установить значение 0
<Directory /home/bitrix/www/invoice>
AllowOverride All
php_admin_value mbstring.func_overload 0
</Directory>
т.е. вся начинка по генерации счета лежит в папке /home/bitrix/www/invoice
Теперь-то все по красоте!