1
iprintformpdf.php in trunk/web/include/doc/printforms – MultiMag

source: trunk/web/include/doc/printforms/iprintformpdf.php @ 986

Last change on this file since 986 was 986, checked in by blacklight, 8 months ago
  • Добвлен вывод печати организации в печатную форму коммерческого предложения
  • Проведён рефакторинг печатных форм документов
File size: 10.3 KB
Line 
1<?php
2//      MultiMag v0.2 - Complex sales system
3//
4//      Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
5//
6//      This program is free software: you can redistribute it and/or modify
7//      it under the terms of the GNU Affero General Public License as
8//      published by the Free Software Foundation, either version 3 of the
9//      License, or (at your option) any later version.
10//
11//      This program is distributed in the hope that it will be useful,
12//      but WITHOUT ANY WARRANTY; without even the implied warranty of
13//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14//      GNU Affero General Public License for more details.
15//
16//      You should have received a copy of the GNU Affero General Public License
17//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
18//
19
20namespace doc\printforms; 
21
22/// Абстрактный класс печатной формы
23abstract class iPrintFormPdf {
24
25    /**
26     * @var \document|\doc_Nulltype Ссылка на документ с данными для печати
27     */
28    protected $doc;
29
30    /**
31     * @var \PDF_MC_Table Объект FPDF
32     */
33    protected $pdf;
34   
35    // Параметы форм
36    protected $line_normal_w = 0.25;   // Стандартная толщина линии
37    protected $line_bold_w = 0.6;   // Толщина жирной линии
38    protected $line_thin_w = 0.18;   // Толщина тонкой линии
39   
40    public $mime = "application/pdf";
41   
42    public function __construct() {
43       
44    }
45
46        /// Установить ссылку на распечатываемый документ
47    public function setDocument($doc) {
48        $this->doc = $doc;
49    }
50   
51    public function getMimeType() {
52        return $this->mime;
53    }
54             
55    /// Инициализация модуля вывода данных
56    public function initForm($orient = 'P') {
57        require('fpdf/fpdf_mc.php');
58        $this->pdf = new \PDF_MC_Table($orient);
59        $this->pdf->Open();
60        $this->pdf->SetAutoPageBreak(1, 5);
61        $this->pdf->AddFont('Arial', '', 'arial.php');
62        $this->pdf->SetFont('Arial', '', 10);
63        $this->pdf->tMargin = 5;
64        $this->pdf->SetFillColor(255);
65    }
66       
67    /// Добавить страницу с техническим заголовком
68    protected function addPage($orientation = '') {
69        $this->pdf->AddPage($orientation);
70        $this->addTechFooter();
71    }
72
73    /// Добавить к документу футер с технической информацией
74    protected function addTechFooter() {
75        $x = $this->pdf->getX();
76        $y = $this->pdf->getY();
77        $this->pdf->SetX($this->pdf->rMargin - 50);
78        $this->pdf->SetY($this->pdf->h - $this->pdf->bMargin - $this->pdf->tMargin);
79        $old_font_size = $this->pdf->FontSizePt;
80        $this->pdf->SetFontSize(2.5);
81        $str = 'Подготовлено в multimag v:'.MULTIMAG_VERSION.' ('.get_class($this).'), док.'.$this->doc->getId();
82        $this->pdf->CellIconv(0, 2, $str, 0, 1, 'R');
83        $this->pdf->SetFontSize($old_font_size);
84        $this->pdf->SetX($x);
85        $this->pdf->SetY($y);
86    }
87   
88    // Контроль расстояния до конца листа
89    protected function controlPageBreak($offset = 20, $orientation = '') {
90        $workspace_h = $this->pdf->h - $this->pdf->bMargin - $this->pdf->tMargin;
91        if ($workspace_h <= ($this->pdf->GetY() + $offset )) {
92            $this->addPage($orientation);               
93        }
94    }
95
96        /// Добавить стандартный заголовок формы
97    protected function addHeader($text) {
98        $this->pdf->SetFontSize(18);
99        $this->pdf->MultiCellIconv(0, 8, $text, 0, 'C');
100    }
101   
102    /// Добавить уменьшенный заголовок
103    protected function addMiniHeader($text) {
104        $this->pdf->SetFontSize(16);
105        $this->pdf->MultiCellIconv(0, 8, $text, 0, 'C');
106    }
107   
108    /// Добавить стандартную информационную строку
109    protected function addInfoLine($text, $font_size = 10) {
110        $this->pdf->SetFontSize($font_size);
111        $this->pdf->MultiCellIconv(0, 5, $text, 0, 'L');
112    }
113   
114    /// Добавить стандартную строку подписи
115    protected function addSignLine($text) {
116        $this->pdf->SetFontSize(10);
117        $this->pdf->CellIconv(0, 7, $text, 0, 1, 'L');
118    }
119   
120    /// Добавить стандартный заголовок таблицы
121    protected function addTableHeader($th_widths, $th_texts, $tbody_aligns = null, $font_size = 10) {
122        $this->pdf->SetFontSize($font_size);
123        $this->pdf->SetLineWidth($this->line_bold_w);
124        foreach ($th_widths as $id => $w) {
125            $this->pdf->CellIconv($w, 6, $th_texts[$id], 1, 0, 'C', 0);
126        }       
127        $this->pdf->Ln();
128        $this->pdf->SetWidths($th_widths);
129        $this->pdf->SetHeight(4);
130        $this->pdf->SetLineWidth($this->line_normal_w);
131        if($tbody_aligns) {
132            $this->pdf->SetAligns($tbody_aligns);
133        }
134        $this->pdf->SetFontSize(8);
135    }
136
137    /**
138     * Добавить изображение шапки
139     * @param $firm_id int ID организации
140     * @throws \Exception
141     */
142    protected function addHeadBanner($firm_id) {
143        if (\cfg::get('site', 'doc_header')) {
144            $header_img = str_replace('{FN}', $firm_id, \cfg::get('site', 'doc_header'));
145            $size = getimagesize($header_img);
146            if (!$size) {
147                throw new \Exception("Не удалось открыть файл изображения");
148            }
149            if ($size[2] != IMAGETYPE_JPEG) {
150                throw new \Exception("Файл изображения не в jpeg формате");
151            }
152            if ($size[0] < 800) {
153                throw new \Exception("Разрешение изображения слишком мало! Допустимя ширина - не менее 800px");
154            }
155            $width = 190;
156            $offset_y = $size[1] / $size[0] * $width + 14;
157            $this->pdf->Image($header_img, 8, 10, $width);
158            $this->pdf->Sety($offset_y);
159        }
160    }
161   
162    /// Добавить информацию о сайте
163    protected function addSiteBanner() {
164        $pref = \pref::getInstance();
165        $this->pdf->SetFontSize(12);
166        $str = "Система интернет-заказов для постоянных клиентов доступна на нашем сайте";
167        $this->pdf->CellIconv(0, 5, $str, 0, 1, 'C', 0);
168
169        $this->pdf->SetTextColor(0, 0, 192);
170        $this->pdf->SetFont('', 'UI', 18);
171        $this->pdf->Cell(0, 7, 'http://' . $pref->site_name, 0, 1, 'C', 0, 'http://' . $pref->site_name);
172
173        $this->pdf->SetTextColor(0, 0, 0);
174        $this->pdf->SetFont('', '', 12);
175        $str = "При оформлении заказа через сайт предоставляются специальные цены!";
176        $this->pdf->CellIconv(0, 8, $str, 0, 1, 'C', 0);
177    }
178
179    /**  Добавить изображение с печатью и подписью
180     * @param $firm_id integer ID организации
181     */
182    protected function addSignAndStampImage($firm_id) {
183        if($firm_id == 0) {
184            throw new \OutOfBoundsException('ID организации не задан');
185        }
186        if (\cfg::get('site', 'doc_shtamp')) {
187            $workspace_h = $this->pdf->h - $this->pdf->bMargin - $this->pdf->tMargin;
188            $delta = $workspace_h - ($this->pdf->GetY() + 50);
189            if ($delta > 17) {
190                $delta = 17;
191            }
192            $shtamp_img = str_replace('{FN}', $firm_id, \cfg::get('site', 'doc_shtamp'));
193            $this->pdf->Image($shtamp_img, 4, $this->pdf->GetY() + $delta, 120);
194        }
195    }
196
197
198    /// Добавить информацию о сторуднике в нижний правый угол страницы
199    protected function addWorkerInfo($doc_data) {
200        global $db;
201        $footer_info = array();
202        $res = $db->query("SELECT `worker_real_name`, `worker_post_name`, `worker_phone`, `worker_email`, `worker_jid`"
203            . " FROM `users_worker_info`"
204            . " WHERE `user_id`='{$doc_data['user']}'");
205        if ($res->num_rows) {
206            $worker_info = $res->fetch_assoc();
207            if ($worker_info['worker_post_name']) {
208                $footer_info[] = $worker_info['worker_post_name'] . ' ' . $worker_info['worker_real_name'];
209            } else {
210                $footer_info[] = "Сотрудник " . $worker_info['worker_real_name'];
211            }
212            if ($worker_info['worker_phone']) {
213                $footer_info[] = "Контактный телефон: " . $worker_info['worker_phone'];
214            }
215            if ($worker_info['worker_email']) {
216                $footer_info[] = "email адрес: " . $worker_info['worker_email'];
217            }
218            if ($worker_info['worker_jid']) {
219                $footer_info[] = "Идентификатор jabber/xmpp: " . $worker_info['worker_jid'];
220            }
221        }
222        else {       
223            $footer_info[] = "Login автора: " . $_SESSION['name'];
224        } 
225        $line_width = 4; 
226        $this->pdf->SetAutoPageBreak(0, 10);
227        $this->pdf->SetFontSize(10);
228        $this->pdf->SetY($this->pdf->h - 5 - count($footer_info)*$line_width);
229        $this->pdf->Ln(1);
230       
231        foreach($footer_info as $text) {           
232            $this->pdf->CellIconv(0, 4, $text, 0, 1, 'R', 0);
233        }
234    }
235
236    /// Вывод данных
237    /// @param $to_str Если истина - вернёт буфер с данными. Иначе - вывод в файл.
238    public function outData($to_str=false) {
239        $fname = get_class($this);
240        $matches = null;
241        if (preg_match('@\\\\([\w]+)$@', $fname, $matches)) {
242            $fname = $matches[1];
243        }
244       
245        if ($to_str) {
246            return $this->pdf->Output($fname.'.pdf', 'S');
247        }
248        else {
249            $this->pdf->Output($fname.'.pdf', 'I');
250        }
251    }
252   
253    /// Сформировать данные печатной формы
254    abstract public function make();
255   
256    /// Возвращает имя документа
257    abstract public function getName();
258}
Note: See TracBrowser for help on using the repository browser.