Возникла необходимость добавить в письмо joomshopping свой собственный бланк, для распечатки его курьеру. Клиент заказывает товар, на почту администратору приходит письмо с бланком заказа, печатаем этот бланк на принтере и отдаем в доставку. Встроенный pdf нас почему-то не устроил и решил я колхозить ворд. Тем более, что ворд перед печатью можжно редактировать при необходимости.
Заказчик отправил мне бланк в ворде, который должен был приходить в письме.
Вот так примерно это выглядит и красным выделено то, что должно заполнятся автоматически.
1. Ищем класс для работы с microsoft word. Их достаточно много, я выбрал один из первых попавшихся. Называется он rtftools, внутри там несколько библиотек, мне для работы нужна была только RtfFileTemplater. Автор christian.vigh, всю библитеку я прицепляю к письму
2. Библиотека очень простая, шаблоны прилагаются. Разобраться очень просто. Ну по порядку. Я решил сделать вызов из шаблона письма, там есть все нужные нам данные. Идем в ../com_jshopping/templates/default/checkout/ordermail.php
Это шаблон письма, которое отправляется клиенту и администратору. В самый конец файла добавим
<?php
$basepath = $_SERVER['DOCUMENT_ROOT'];
include_once($basepath.'/orders/order.php');
Тоесть при каждом формировании письма вызываю свой скрипт order.php
Я решил, что не буду городить прямо в файлах joomshopping, а создам отдельную папку с библиотекой. Вот содержтмое папочки order, которая лежит в корне сайта
Три файла phpclass - это собственно библиотека, rtf-template - шаблон, Blank_zakaz - готовый файл. Про саму библиотеку написано в мануалах к ней, я даже особо не вникал в нее. Шаблон выглядит очень просто -
Я его тоже вложил на всякий случай. Как видно из шаблона, переменные обрамляются в%, сама переменная как и в php начинается с $. Есть небольшой нюансик с циклами, но тоже все просто через foreach. В библиотеке есть все примеры, там достаточно большие возможности, я использую только малую часть. Собственно библиотека парсит ртф, находит там объявленную переменную и подставляет.
Теперь то что касается самого скрипта. Он небольшой и не сложный, все переменные берутся из тела письма. Сложность только возникла с кратким описанием, его нет в теле письма, его вытаскиваем запросом.
Вот листинг. Если вкратце - разбиваем все данные на две части, в перввой части вся статика, типа номера заказа, имени, текста открытки. Вторая часть - переменная состав заказа. Потом массивы объединяем и вызываем нашу библиотеку. Собственно и все, ничего сложного. Сложность только с кратким описанием.
<?php
//Формируем rtf файд для отправки
header('Content-Type: text/html; charset=windows-1251');
include ( 'RtfTemplater.phpclass' ) ;
$var1 =
[
'zkz_num' => iconv ('utf-8', 'windows-1251', $this->order->order_number),
'zkz_date' => iconv ('utf-8', 'windows-1251', strftime("%a, %d/%m/%Y", strtotime($this->order->order_date))),
'zkz_time' => iconv ('utf-8', 'windows-1251', $this->order->ext_field_2),
'otkrytka' => iconv ('utf-8', 'windows-1251', $this->order->order_add_info),
'poluchatel' => iconv ('utf-8', 'windows-1251', $this->order->d_f_name . " ". $this->order->d_l_name),
'polphone' => iconv ('utf-8', 'windows-1251', $this->order->phone),
'usloviadost' => iconv ('utf-8', 'windows-1251', $this->order->d_phone),
'poluchateladdr' => iconv ('utf-8', 'windows-1251', "г. ".$this->order->d_city . " Ул. ". $this->order->d_street." Дом ".$this->order->d_home. " Кв. ".$this->order->d_apartment)
];
foreach($this->products as $key_id=>$prod)
{
$aproduct = JSFactory::getTable("product", "jshop");
$aproduct->load($prod->product_id);
// вот на эту строчку я грохнул полдня! оказывается для получения записи после загрузки нужно написать get
$shortdesc = $aproduct->get("short_description_ru-RU");
$array [] = iconv ('utf-8', 'windows-1251',
$prod->product_quantity.' x '.$prod->product_name.' - '.$shortdesc
);
}
//] ;
$var2 = ['ARRAY' =>$array];
$variables = array_merge($var1, $var2);
print_r ();
//exit;
$templater = new RtfStringTemplater ( file_get_contents ( $_SERVER['DOCUMENT_ROOT'].'/orders/rtf_template.rtf' ), $variables ) ;
$templater -> SaveTo ( $_SERVER['DOCUMENT_ROOT'].'/orders/Blank_zakaz.rtf' ) ;
?>
(567.92 kB, количество скачиваний: 142) | |
(57.25 kB, количество скачиваний: 182) |