В предыдущем посте писал о том, что была задача выгрузить информацию по заказам в файл 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();
Вот такая нехитрая конструкция позволяет сделать жизнь менеджеров немного проще.
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.