Генерация псевдо-xls-файла с заказами

Генерация псевдо-xls-файла с заказами

147
06.06.2018
07.08.2018

В предыдущем посте писал о том, что была задача выгрузить информацию по заказам в файл xls для последующей обработки. 

Если нужно сгенерировать файл со стилями, с функциями, со сложными обработками - тут, конечно же не обойтись без специальных библиотек, вродe PHPExcel. Но если нужны просто данные, которые можно открыть в экселе, как нужно подправить и отправить на печать - тут можно обойтись и без сторонних библиотек.

В нашем, упрощенном варианте, мы просто создадим html-файл с таблицей, который сохраним как .xls. А при открытии экселем данный файл автоматически будет прочитан в таблицу.

Итак, для начала получаем всю необходимую информацию по заказам:

use Bitrix\Main\IO;
use Bitrix\Main\Application;
\Bitrix\Main\Loader::includeModule('sale');

	$orders = array(XXX.....);  // - массив из идентификаторов заказов, которые нужно выгрузить
if(!empty($orders))
{
	$arOrdersList = array();
	foreach ($orders as $orderID)
	{
		$order = Bitrix\Sale\Order::load(intval($orderID));
		$propertyCollection = $order->getPropertyCollection();
		$arProperties = array();
		foreach ($propertyCollection->getArray()['properties'] as $property)
		{
			$arProperties[$property['CODE']] = array(
				'NAME'=>$property['NAME'],
				'VALUE'=>$property['VALUE'][0]
			);
		}

		$arBasket = array();
		$basketItems = $order->getBasket()->getBasketItems();
		foreach ($basketItems as $basketItem)
		{
			$arBasket[] = array(
				'ID'=>$basketItem->getId(),
				'PRODUCT_ID'=>$basketItem->getProductId(),
				'NAME'=>$basketItem->getField('NAME'),
				'PRICE'=>$basketItem->getPrice(),
				'QUANTITY'=>$basketItem->getQuantity(),
				'FINAL_PRICE'=>$basketItem->getFinalPrice()
			);
		}

		$arOrdersList[] = array(
			'ID'=>$order->getId(),
			'NUMBER'=>$order->getField('ACCOUNT_NUMBER'),
			'OWNER'=>$arProperties['FIO']['VALUE'],
			'PHONE'=>$arProperties['PHONE']['VALUE'],
			'ADDR'=>$arProperties['ADDRESS']['VALUE'],
			'BASKET'=>$arBasket,
			'ORDER_SUM'=>$order->getPrice(),
			'ORDER_SUM_PAYD'=>$order->getSumPaid(),
			'USER_DESCRIPTION'=>$order->getField('USER_DESCRIPTION'),
			'COMMENTS'=>$order->getField('COMMENTS'),
			'ADDITIONAL_INFO'=>$order->getField('ADDITIONAL_INFO'),
		);
	}
}

Дальше - создаем файл, в который помещаем полученную информацию:

$resultFile = '/upload/data.xls';
$resultAbsFile = Application::getDocumentRoot().$resultFile;
$file = new IO\File($resultAbsFile);
$file->putContents('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="author" /&пt;
<title>Demo</title>
</head>
<body>
');
$file->putContents('<table border="1 cellspacing="0" cellpadding="0" class="ta1">',IO\File::APPEND);
$file->putContents('<tr>
	<th>№ заказа</th>
	<th>Покупатель</th>
	<th>Телефон</th>
	<th>Адрес доставки:<br> из поля коментарий</th>
	<th>Состав заказа</th>
	<th>Кол-во</th>
	<th>Цена<br>Цена в чек</th>
	<th>Итого к оплате <br>Наложенный платеж</th>

</tr>',IO\File::APPEND);

Помещаем в файл информацию по заказам:

foreach ($arOrdersList as $arOrder)
	{
		$addrLine = $arOrder['ADDR'];
		if(strlen($arOrder['COMMENTS'])>0) $addrLine .= '<br>'.$arOrder['COMMENTS'];
		if(strlen($arOrder['USER_DESCRIPTION'])>0 && $arOrder['USER_DESCRIPTION']!==$arOrder['COMMENTS']) $addrLine .= '<br>'.$arOrder['USER_DESCRIPTION'];
		$basketLine = '<td>';
		foreach ($arOrder['BASKET'] as $num=>$arBasketItem)
		{
			$basketLine.=$arOrder['BASKET'][$num]['NAME'].(count($arOrder['BASKET'])>0 ? '<br>' : '');
		}
		$basketLine .= '</td>';
		$basketLine.='<td>';
		foreach ($arOrder['BASKET'] as $num=>$arBasketItem)
		{
			$basketLine.=$arOrder['BASKET'][$num]['QUANTITY'].(count($arOrder['BASKET'])>0 ? '<br>' : '');
		}
		$basketLine.='</td>';

		$basketLine.='<td>';
		foreach ($arOrder['BASKET'] as $num=>$arBasketItem)
		{
			$basketLine.=$arOrder['BASKET'][$num]['PRICE'].(count($arOrder['BASKET'])>0 ? '<br>' : '');
		}
		$basketLine.='</td>';

		$file->putContents('<tr>',IO\File::APPEND);
		$file->putContents('
			<td>'.$arOrder['NUMBER'].'</td>
			<td>'.$arOrder['OWNER'].'</td>
			<td>'."'".$arOrder['PHONE']." ".'</td>
			<td>'.$addrLine.'</td>'
			.$basketLine.
			'<td>'.(floatval($arOrder['ORDER_SUM'])-floatval($arOrder['ORDER_SUM_PAYD'])).'</td>
			',IO\File::APPEND);
		$file->putContents('</tr>',IO\File::APPEND);
	}

и завершаем файл:

$file->putContents('</table>',IO\File::APPEND);
	$file->putContents('</body></html>',IO\File::APPEND);
	$APPLICATION->RestartBuffer();
		header('Content-type: application/json');
		echo \Bitrix\Main\Web\Json::encode(array('url'=>$resultFile));
		exit();

Вот такая нехитрая конструкция позволяет сделать жизнь менеджеров немного проще.



Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

Добавить комментарий

captcha

Возврат к списку