Main menu

Возникла необходимость добавить в письмо 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' ) ;

?>

 

zip (567.92 kB, количество скачиваний: 142)
rtf (57.25 kB, количество скачиваний: 182)