diff --git a/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php b/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php index d2bc03b190..0d9c4a466f 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/PrinterController.php @@ -12,7 +12,7 @@ namespace Alchemy\Phrasea\Controller\Prod; use Alchemy\Phrasea\Application\Helper\DataboxLoggerAware; use Alchemy\Phrasea\Controller\Controller; use Alchemy\Phrasea\Helper\Record as RecordHelper; -use Alchemy\Phrasea\Out\Module\PDF as PDFExport; +use Alchemy\Phrasea\Out\Module\PDFRecords; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -24,19 +24,27 @@ class PrinterController extends Controller { $printer = new RecordHelper\Printer($this->app, $request); - return $this->render('prod/actions/printer_default.html.twig', ['printer' => $printer, 'message' => '']); + $basketFeedbackId = null; + if($printer->is_basket() && ($basket = $printer->get_original_basket()) && ($validation = $basket->getValidation())) { + if($validation->getInitiator()->getId() === $this->app->getAuthenticatedUser()->getId()) { + $basketFeedbackId = $basket->getId(); + } + } + + return $this->render('prod/actions/printer_default.html.twig', ['printer' => $printer, 'message' => '', 'basketFeedbackId' => $basketFeedbackId]); } public function printAction(Request $request) { $printer = new RecordHelper\Printer($this->app, $request); + $b = $printer->get_original_basket(); $layout = $request->request->get('lay'); foreach ($printer->get_elements() as $record) { $this->getDataboxLogger($record->getDatabox())->log($record, \Session_Logger::EVENT_PRINT, $layout, ''); } - $PDF = new PDFExport($this->app, $printer->get_elements(), $layout); + $PDF = new PDFRecords($this->app, $printer, $layout); $response = new Response($PDF->render(), 200, array('Content-Type' => 'application/pdf')); $response->headers->set('Pragma', 'public', true); @@ -44,4 +52,5 @@ class PrinterController extends Controller return $response; } + } diff --git a/lib/Alchemy/Phrasea/Model/Entities/Basket.php b/lib/Alchemy/Phrasea/Model/Entities/Basket.php index c25b074634..eea18b21e0 100644 --- a/lib/Alchemy/Phrasea/Model/Entities/Basket.php +++ b/lib/Alchemy/Phrasea/Model/Entities/Basket.php @@ -456,17 +456,27 @@ class Basket } public function hasRecord(Application $app, \record_adapter $record) + { + return !is_null($this->getElementByRecord($app, $record)); + } + + /** + * @param Application $app + * @param \record_adapter $record + * @return BasketElement + */ + public function getElementByRecord(Application $app, \record_adapter $record) { foreach ($this->getElements() as $basket_element) { $bask_record = $basket_element->getRecord($app); if ($bask_record->getRecordId() == $record->getRecordId() && $bask_record->getDataboxId() == $record->getDataboxId()) { - return true; + return $basket_element; } } - return false; + return null; } public function getSize(Application $app) diff --git a/lib/Alchemy/Phrasea/Out/Module/PDF.php b/lib/Alchemy/Phrasea/Out/Module/PDF.php index 7514a099db..7e29c3b459 100644 --- a/lib/Alchemy/Phrasea/Out/Module/PDF.php +++ b/lib/Alchemy/Phrasea/Out/Module/PDF.php @@ -20,6 +20,7 @@ class PDF protected $records; protected $pdf; + const LAYOUT_FEEDBACK = 'feedback'; const LAYOUT_PREVIEW = 'preview'; const LAYOUT_PREVIEWCAPTION = 'previewCaption'; const LAYOUT_PREVIEWCAPTIONTDM = 'previewCaptionTdm'; @@ -27,64 +28,10 @@ class PDF const LAYOUT_THUMBNAILGRID = 'thumbnailGrid'; const LAYOUT_CAPTION = 'caption'; - public function __construct(Application $app, array $records, $layout) + public function __construct(Application $app) { $this->app = $app; - $list = []; - - foreach ($records as $record) { - switch ($layout) { - default: - throw new \Exception('Unknown layout'); - break; - case self::LAYOUT_PREVIEW: - case self::LAYOUT_PREVIEWCAPTION: - case self::LAYOUT_PREVIEWCAPTIONTDM: - try { - $subdef = $record->get_subdef('preview'); - // fallback to thumbnail ( video, sound, doc ) .. - if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { - $subdef = $record->get_thumbnail(); - } - - if (!$subdef->is_physically_present()) { - continue 2; - } - - if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { - continue 2; - } - } catch (\Exception $e) { - continue 2; - } - break; - case self::LAYOUT_THUMBNAILLIST: - case self::LAYOUT_THUMBNAILGRID: - try { - $subdef = $record->get_thumbnail(); - if (!$subdef->is_physically_present()) { - continue 2; - } - - if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { - continue 2; - } - } catch (\Exception $e) { - continue 2; - } - break; - case self::LAYOUT_CAPTION: - break; - } - - $record->setNumber(count($list) + 1); - - $list[] = $record; - } - - $this->records = $list; - $pdf = new PhraseaPDF("P", "mm", "A4", true, 'UTF-8', false); $pdf->SetAuthor("Phraseanet"); @@ -92,29 +39,6 @@ class PDF $pdf->SetDisplayMode("fullpage", "single"); $this->pdf = $pdf; - - switch ($layout) { - case self::LAYOUT_PREVIEW: - $this->print_preview(false, false); - break; - case self::LAYOUT_PREVIEWCAPTION: - $this->print_preview(false, true); - break; - case self::LAYOUT_PREVIEWCAPTIONTDM: - $this->print_preview(true, true); - break; - case self::LAYOUT_THUMBNAILLIST: - $this->print_thumbnailList(); - break; - case self::LAYOUT_THUMBNAILGRID: - $this->print_thumbnailGrid(); - break; - case self::LAYOUT_CAPTION: - $this->print_caption(); - break; - } - - return $this; } public function render() @@ -123,447 +47,4 @@ class PDF return $this->pdf->Output('', 'S'); } - - protected function print_thumbnailGrid($links = false) - { - $NDiapoW = 3; - $NDiapoH = 4; - - $this->pdf->AddPage(); - - $oldMargins = $this->pdf->getMargins(); - $tmargin = $oldMargins['top']; - $lmargin = $oldMargins['left']; - $bmargin = $oldMargins['bottom']; - $rmargin = $oldMargins['right']; - - $this->pdf->SetLeftMargin($lmargin + 55); - - $clientW = $this->pdf->getPageWidth() - $lmargin - $rmargin; - $clientH = $this->pdf->getPageHeight() - $tmargin - $bmargin; - - $DiapoW = floor($clientW / $NDiapoW); - $DiapoH = floor($clientH / $NDiapoH); - $TitleH = 5; - $ImgSize = min($DiapoW, ($DiapoH - $TitleH)) - 5; - - $npages = ceil(count($this->records) / ($NDiapoW * $NDiapoH)); - - $irow = $ipage = 0; - $icol = -1; - foreach ($this->records as $rec) { - /* @var \record_adapter $rec */ - if (++$icol >= $NDiapoW) { - $icol = 0; - if (++$irow >= $NDiapoH) { - $irow = 0; - $ipage++; - $this->pdf->AddPage(); - } - } - $fimg = null; - $himg = 0; - - $subdef = $rec->get_subdef('preview'); - - if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { - $subdef = $rec->get_thumbnail(); - } - - $fimg = $subdef->getRealPath(); - - if (!$this->app->getAclForUser($this->app->getAuthenticatedUser())->has_right_on_base($rec->getBaseId(), \ACL::NOWATERMARK) - && $subdef->get_type() == \media_subdef::TYPE_IMAGE) { - $fimg = \recordutils_image::watermark($this->app, $subdef); - } - - $wimg = $himg = $ImgSize; - if ($subdef->get_height() > 0 && $subdef->get_width() > 0) { - if ($subdef->get_width() > $subdef->get_height()) - $himg = $wimg * $subdef->get_height() / $subdef->get_width(); - else - $wimg = $himg * $subdef->get_width() / $subdef->get_height(); - } - - if ($fimg) { - $x = $lmargin + ($icol * $DiapoW); - $y = $tmargin + ($irow * $DiapoH); - $this->pdf->SetDrawColor(0); - $this->pdf->Rect($x, $y, $DiapoW, $DiapoH, "D"); - - $this->pdf->SetXY($x, $y + 1); - $this->pdf->SetFont(PhraseaPDF::FONT, '', 10); - $t = $irow . '-' . $x; - $t = $rec->get_title(); - - if ($links) { - $lk = $this->pdf->AddLink(); - $this->pdf->SetLink($lk, 0, $npages + $rec->getNumber()); - $this->pdf->Image( - $fimg - , $x + (($DiapoW - $wimg) / 2) - , $TitleH + $y + (($DiapoH - $TitleH - $himg) / 2) - , $wimg, $himg - , null, $lk - ); - } else { - $this->pdf->Image($fimg - , $x + (($DiapoW - $wimg) / 2) - , $TitleH + $y + (($DiapoH - $TitleH - $himg) / 2) - , $wimg, $himg - ); - } - - $this->pdf->MultiCell($DiapoW, $TitleH, $t, '0', 'C', false); - } - } - $this->pdf->SetLeftMargin($oldMargins['left']); - } - - protected function print_thumbnailList() - { - $this->pdf->AddPage(); - $oldMargins = $this->pdf->getMargins(); - - $lmargin = $oldMargins['left']; - $rmargin = $oldMargins['right']; - - $this->pdf->SetLeftMargin($lmargin + 55); - - $ndoc = 0; - foreach ($this->records as $rec) { - /* @var \record_adapter $rec */ - $subdef = $rec->get_subdef('thumbnail'); - - $fimg = $subdef->getRealPath(); - - $wimg = $himg = 50; - // 1px = 3.77952 mm - $finalWidth = round($subdef->get_width() / 3.779528, 2); - $finalHeight = round($subdef->get_height() / 3.779528, 2); - $aspectH = $finalWidth/$finalHeight; - $aspectW = $finalHeight/$finalWidth; - - if ($finalWidth > 0 && $finalHeight > 0) { - if ($finalWidth > $finalHeight && $finalWidth > $wimg) { - $finalWidth = $wimg; - $finalHeight = $wimg * $aspectW; - } else if ($finalHeight > $finalWidth && $finalHeight > $himg) { - $finalHeight = $himg; - $finalWidth = $himg * $aspectH; - } else if ($finalHeight == $finalWidth & $finalWidth > $wimg) { - $finalHeight = $wimg; - $finalWidth = $himg; - } - } - - if ($this->pdf->GetY() > $this->pdf->getPageHeight() - (6 + $finalHeight + 20)) - $this->pdf->AddPage(); - - $title = "record : " . $rec->get_title(); - - $y = $this->pdf->GetY(); - - $t = \phrasea::bas_labels($rec->getBaseId(), $this->app); - $this->pdf->SetFont(PhraseaPDF::FONT, '', 10); - $this->pdf->SetFillColor(220, 220, 220); - $this->pdf->SetLeftMargin($lmargin); - $this->pdf->SetRightMargin($rmargin); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - - $this->pdf->out = false; - $this->pdf->MultiCell(140, 4, $title, "LTR", "L", 1); - $y2 = $this->pdf->GetY(); - $h = $y2 - $y; - $this->pdf->out = true; - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - $this->pdf->Cell(0, $h, "", "LTR", 1, "R", 1); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - $this->pdf->Cell(0, 4, $t, "", 1, "R"); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - $this->pdf->MultiCell(140, 4, $title, "", "L"); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y = $y2); - - $this->pdf->SetLeftMargin($lmargin + 55); - $this->pdf->SetY($y + 2); - - if ($fimg) { - $y = $this->pdf->GetY(); - $this->pdf->Image($fimg, $lmargin, $y, $finalWidth, $finalHeight); - $this->pdf->SetY($y + 3); - } - - $nf = 0; - $this->pdf->SetX($lmargin + 55); - $p0 = $this->pdf->PageNo(); - $y0 = $this->pdf->GetY(); - foreach ($rec->get_caption()->get_fields() as $field) { - /* @var $field caption_field */ - - $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); - $this->pdf->Write(5, $field->get_name() . " : "); - - $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); - $this->pdf->Write(5, $field->get_serialized_values()); - - $this->pdf->Write(6, "\n"); - $nf++; - } - if ($this->pdf->PageNo() == $p0 && ($this->pdf->GetY() - $y0) < $finalHeight) - $this->pdf->SetY($y0 + $finalHeight); - $ndoc++; - } - $this->pdf->SetLeftMargin($lmargin); - } - - protected function print_caption() - { - $this->pdf->AddPage(); - $oldMargins = $this->pdf->getMargins(); - - $lmargin = $oldMargins['left']; - $rmargin = $oldMargins['right']; - - foreach ($this->records as $rec) { - $title = "record : " . $rec->get_title(); - - $y = $this->pdf->GetY(); - if($this->pdf->getPageHeight() - $y < 20){ // height of the footer is 15 - $this->pdf->AddPage(); - $y = $oldMargins['top']; - } - - $t = \phrasea::bas_labels($rec->getBaseId(), $this->app); - $this->pdf->SetFont(PhraseaPDF::FONT, '', 10); - $this->pdf->SetFillColor(220, 220, 220); - $this->pdf->SetLeftMargin($lmargin); - $this->pdf->SetRightMargin($rmargin); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - - $this->pdf->out = false; - $this->pdf->MultiCell(140, 4, $title, "LTR", "L", 1); - $y2 = $this->pdf->GetY(); - $h = $y2 - $y; - $this->pdf->out = true; - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - $this->pdf->Cell(0, $h, "", "LTR", 1, "R", 1); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - $this->pdf->Cell(0, 4, $t, "", 1, "R"); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y); - $this->pdf->MultiCell(140, 4, $title, "", "L"); - $this->pdf->SetX($lmargin); - $this->pdf->SetY($y = $y2); - $this->pdf->SetY($y + 2); - - foreach ($rec->get_caption()->get_fields() as $field) { - $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); - $this->pdf->Write(5, $field->get_name() . " : "); - - $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); - $t = str_replace( - ["<", ">", "&"] - , ["<", ">", "&"] - , strip_tags($field->get_serialized_values()) - ); - $this->pdf->Write(5, $t); - - $this->pdf->Write(6, "\n"); - } - $this->pdf->SetY($this->pdf->GetY() + 10); - } - } - - protected function print_preview($withtdm, $write_caption) - { - if ($withtdm === true) { - $this->print_thumbnailGrid($this->pdf, $this->records, true); - } - - foreach ($this->records as $krec => $rec) { - /* @var \record_adapter $rec */ - - $this->pdf->AddPage(); - - if ($withtdm === "CALCPAGES") { - $rec->setNumber($this->pdf->PageNo()); - } - $lmargin = $this->pdf->GetX(); - $himg = 0; - $y = 0; - $miniConv = NULL; - - $LEFT__TEXT = ""; - $LEFT__IMG = NULL; - $RIGHT_TEXT = ""; - $RIGHT_IMG = NULL; - - $LEFT__IMG = $this->app['root.path'] . "/config/minilogos/logopdf_" . $rec->getDataboxId() . ".jpg"; - - if (!is_file($LEFT__IMG)) { - $databox = $rec->getDatabox(); - $str = $databox->get_sxml_structure(); - $vn = (string) ($str->pdfPrintLogo); - if (($vn * 1) == 1) { - $LEFT__TEXT = $databox->get_label($this->app['locale']); - } - } - - $collection = \collection::getByBaseId($this->app, $rec->getBaseId()); - - $vn = ""; - if (false !== $str = simplexml_load_string($collection->get_prefs())) { - $vn = (string) ($str->pdfPrintappear); - } - - if ($vn == "" || $vn == "1") { - $RIGHT_TEXT = \phrasea::bas_labels($rec->getBaseId(), $this->app); - } elseif ($vn == "2") { - $RIGHT_IMG = $this->app['root.path'] . "/config/minilogos/" . $rec->getBaseId(); - } - - $xtmp = $this->pdf->GetX(); - $ytmp = $this->pdf->GetY(); - - $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); - $this->pdf->SetFillColor(220, 220, 220); - $y = $this->pdf->GetY(); - $this->pdf->MultiCell(95, 7, $LEFT__TEXT, "LTB", "L", 1); - $y2 = $this->pdf->GetY(); - $h = $y2 - $y; - $this->pdf->SetY($y); - $this->pdf->SetX(105); - $this->pdf->Cell(95, $h, $RIGHT_TEXT, "TBR", 1, "R", 1); - - if ($LEFT__TEXT == "" && is_file($LEFT__IMG)) { - if ($size = @getimagesize($LEFT__IMG)) { - $wmm = (int) $size[0] * 25.4 / 72; - $hmm = (int) $size[1] * 25.4 / 72; - if ($hmm > 6) { - $coeff = $hmm / 6; - $wmm = (int) $wmm / $coeff; - $hmm = (int) $hmm / $coeff; - } - $this->pdf->Image($LEFT__IMG, $xtmp + 0.5, $ytmp + 0.5, $wmm, $hmm); - } - } - - if ($RIGHT_IMG != NULL && is_file($RIGHT_IMG)) { - if ($size = @getimagesize($RIGHT_IMG)) { - - if ($size[2] == '1') { - if (!isset($miniConv[$RIGHT_IMG])) { - $tmp_filename = tempnam('minilogos/', 'gif4fpdf'); - $img = imagecreatefromgif($RIGHT_IMG); - imageinterlace($img, 0); - imagepng($img, $tmp_filename); - rename($tmp_filename, $tmp_filename . '.png'); - $miniConv[$RIGHT_IMG] = $tmp_filename . '.png'; - $RIGHT_IMG = $tmp_filename . '.png'; - } else - $RIGHT_IMG = $miniConv[$RIGHT_IMG]; - - $wmm = (int) $size[0] * 25.4 / 72; - $hmm = (int) $size[1] * 25.4 / 72; - if ($hmm > 6) { - $coeff = $hmm / 6; - $wmm = (int) $wmm / $coeff; - $hmm = (int) $hmm / $coeff; - } - $tt = 0; - if ($hmm < 6) - $tt = (6 - $hmm) / 2; - $this->pdf->Image($RIGHT_IMG, 200 - 0.5 - $wmm, $ytmp + 0.5 + $tt); - } else { - $wmm = (int) $size[0] * 25.4 / 72; - $hmm = (int) $size[1] * 25.4 / 72; - if ($hmm > 6) { - $coeff = $hmm / 6; - $wmm = (int) $wmm / $coeff; - $hmm = (int) $hmm / $coeff; - } - $this->pdf->Image($RIGHT_IMG, 200 - 0.5 - $wmm, $ytmp + 0.5); - } - } - } - - $y = $this->pdf->GetY() + 5; - - $subdef = $rec->get_subdef('preview'); - - if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { - $subdef = $rec->get_thumbnail(); - } - - $f = $subdef->getRealPath(); - - if (!$this->app->getAclForUser($this->app->getAuthenticatedUser())->has_right_on_base($rec->getBaseId(), \ACL::NOWATERMARK) - && $subdef->get_type() == \media_subdef::TYPE_IMAGE) - $f = \recordutils_image::watermark($this->app, $subdef); - - // original height / original width x new width = new height - $wimg = $himg = 150; // preview dans un carre de 150 mm - // 1px = 3.77952 mm - $finalWidth = round($subdef->get_width() / 3.779528, 2); - $finalHeight = round($subdef->get_height() / 3.779528, 2); - $aspectH = $finalWidth/$finalHeight; - $aspectW = $finalHeight/$finalWidth; - - if ($finalWidth > 0 && $finalHeight > 0) { - if ($finalWidth > $finalHeight && $finalWidth > $wimg) { - $finalWidth = $wimg; - $finalHeight = $wimg * $aspectW; - } else if ($finalHeight > $finalWidth && $finalHeight > $himg) { - $finalHeight = $himg; - $finalWidth = $himg * $aspectH; - } else if ($finalHeight == $finalWidth & $finalWidth > $wimg) { - $finalHeight = $wimg; - $finalWidth = $himg; - } - } - - $this->pdf->Image($f, (210 - $finalWidth) / 2, $y, $finalWidth, $finalHeight); - - if ($miniConv != NULL) { - foreach ($miniConv as $oneF) - unlink($oneF); - } - $this->pdf->SetXY($lmargin, $y += ( $finalHeight + 5)); - - $nf = 0; - if ($write_caption) { - foreach ($rec->get_caption()->get_fields() as $field) { - /* @var $field caption_field */ - if ($nf > 0) { - $this->pdf->Write(6, "\n"); - } - - $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); - $this->pdf->Write(5, $field->get_name() . " : "); - - $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); - - $t = str_replace( - ["<", ">", "&"] - , ["<", ">", "&"] - , strip_tags($field->get_serialized_values()) - ); - - $this->pdf->Write(5, $t); - - $nf++; - } - } - } - - return; - } } diff --git a/lib/Alchemy/Phrasea/Out/Module/PDFRecords.php b/lib/Alchemy/Phrasea/Out/Module/PDFRecords.php new file mode 100644 index 0000000000..1a201a5499 --- /dev/null +++ b/lib/Alchemy/Phrasea/Out/Module/PDFRecords.php @@ -0,0 +1,675 @@ +printer = $printer; + + $records = $printer->get_elements(); + + $list = []; + + foreach ($records as $record) { + switch ($layout) { + default: + throw new \Exception('Unknown layout'); + break; + case self::LAYOUT_FEEDBACK: + case self::LAYOUT_PREVIEW: + case self::LAYOUT_PREVIEWCAPTION: + case self::LAYOUT_PREVIEWCAPTIONTDM: + try { + $subdef = $record->get_subdef('preview'); + // fallback to thumbnail ( video, sound, doc ) .. + if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { + $subdef = $record->get_thumbnail(); + } + + if (!$subdef->is_physically_present()) { + continue 2; + } + + if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { + continue 2; + } + } catch (\Exception $e) { + continue 2; + } + break; + case self::LAYOUT_THUMBNAILLIST: + case self::LAYOUT_THUMBNAILGRID: + try { + $subdef = $record->get_thumbnail(); + if (!$subdef->is_physically_present()) { + continue 2; + } + + if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { + continue 2; + } + } catch (\Exception $e) { + continue 2; + } + break; + case self::LAYOUT_CAPTION: + break; + } + + $record->setNumber(count($list) + 1); + + $list[] = $record; + } + + $this->records = $list; + + switch ($layout) { + case self::LAYOUT_FEEDBACK: + $this->print_preview(false, true, true); + break; + case self::LAYOUT_PREVIEW: + $this->print_preview(false, false, false); + break; + case self::LAYOUT_PREVIEWCAPTION: + $this->print_preview(false, true, false); + break; + case self::LAYOUT_PREVIEWCAPTIONTDM: + $this->print_preview(true, true, false); + break; + case self::LAYOUT_THUMBNAILLIST: + $this->print_thumbnailList(); + break; + case self::LAYOUT_THUMBNAILGRID: + $this->print_thumbnailGrid(); + break; + case self::LAYOUT_CAPTION: + $this->print_caption(); + break; + } + } + + protected function print_thumbnailGrid($links = false) + { + $NDiapoW = 3; + $NDiapoH = 4; + + $this->pdf->AddPage(); + + $oldMargins = $this->pdf->getMargins(); + $tmargin = $oldMargins['top']; + $lmargin = $oldMargins['left']; + $bmargin = $oldMargins['bottom']; + $rmargin = $oldMargins['right']; + + $this->pdf->SetLeftMargin($lmargin + 55); + + $clientW = $this->pdf->getPageWidth() - $lmargin - $rmargin; + $clientH = $this->pdf->getPageHeight() - $tmargin - $bmargin; + + $DiapoW = floor($clientW / $NDiapoW); + $DiapoH = floor($clientH / $NDiapoH); + $TitleH = 5; + $ImgSize = min($DiapoW, ($DiapoH - $TitleH)) - 5; + + $npages = ceil(count($this->records) / ($NDiapoW * $NDiapoH)); + + $irow = $ipage = 0; + $icol = -1; + foreach ($this->records as $rec) { + /* @var \record_adapter $rec */ + if (++$icol >= $NDiapoW) { + $icol = 0; + if (++$irow >= $NDiapoH) { + $irow = 0; + $ipage++; + $this->pdf->AddPage(); + } + } + $fimg = null; + $himg = 0; + + $subdef = $rec->get_subdef('preview'); + + if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { + $subdef = $rec->get_thumbnail(); + } + + $fimg = $subdef->getRealPath(); + + if (!$this->app->getAclForUser($this->app->getAuthenticatedUser())->has_right_on_base($rec->getBaseId(), \ACL::NOWATERMARK) + && $subdef->get_type() == \media_subdef::TYPE_IMAGE) { + $fimg = \recordutils_image::watermark($this->app, $subdef); + } + + $wimg = $himg = $ImgSize; + if ($subdef->get_height() > 0 && $subdef->get_width() > 0) { + if ($subdef->get_width() > $subdef->get_height()) + $himg = $wimg * $subdef->get_height() / $subdef->get_width(); + else + $wimg = $himg * $subdef->get_width() / $subdef->get_height(); + } + + if ($fimg) { + $x = $lmargin + ($icol * $DiapoW); + $y = $tmargin + ($irow * $DiapoH); + $this->pdf->SetDrawColor(0); + $this->pdf->Rect($x, $y, $DiapoW, $DiapoH, "D"); + + $this->pdf->SetXY($x, $y + 1); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 10); + $t = $irow . '-' . $x; + $t = $rec->get_title(); + + if ($links) { + $lk = $this->pdf->AddLink(); + $this->pdf->SetLink($lk, 0, $npages + $rec->getNumber()); + $this->pdf->Image( + $fimg + , $x + (($DiapoW - $wimg) / 2) + , $TitleH + $y + (($DiapoH - $TitleH - $himg) / 2) + , $wimg, $himg + , null, $lk + ); + } else { + $this->pdf->Image($fimg + , $x + (($DiapoW - $wimg) / 2) + , $TitleH + $y + (($DiapoH - $TitleH - $himg) / 2) + , $wimg, $himg + ); + } + + $this->pdf->MultiCell($DiapoW, $TitleH, $t, '0', 'C', false); + } + } + $this->pdf->SetLeftMargin($oldMargins['left']); + } + + protected function print_thumbnailList() + { + $this->pdf->AddPage(); + $oldMargins = $this->pdf->getMargins(); + + $lmargin = $oldMargins['left']; + $rmargin = $oldMargins['right']; + + $this->pdf->SetLeftMargin($lmargin + 55); + + $ndoc = 0; + foreach ($this->records as $rec) { + /* @var \record_adapter $rec */ + $subdef = $rec->get_subdef('thumbnail'); + + $fimg = $subdef->getRealPath(); + + $wimg = $himg = 50; + // 1px = 3.77952 mm + $finalWidth = round($subdef->get_width() / 3.779528, 2); + $finalHeight = round($subdef->get_height() / 3.779528, 2); + $aspectH = $finalWidth/$finalHeight; + $aspectW = $finalHeight/$finalWidth; + + if ($finalWidth > 0 && $finalHeight > 0) { + if ($finalWidth > $finalHeight && $finalWidth > $wimg) { + $finalWidth = $wimg; + $finalHeight = $wimg * $aspectW; + } else if ($finalHeight > $finalWidth && $finalHeight > $himg) { + $finalHeight = $himg; + $finalWidth = $himg * $aspectH; + } else if ($finalHeight == $finalWidth & $finalWidth > $wimg) { + $finalHeight = $wimg; + $finalWidth = $himg; + } + } + + if ($this->pdf->GetY() > $this->pdf->getPageHeight() - (6 + $finalHeight + 20)) + $this->pdf->AddPage(); + + $title = "record : " . $rec->get_title(); + + $y = $this->pdf->GetY(); + + $t = \phrasea::bas_labels($rec->getBaseId(), $this->app); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 10); + $this->pdf->SetFillColor(220, 220, 220); + $this->pdf->SetLeftMargin($lmargin); + $this->pdf->SetRightMargin($rmargin); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + + $this->pdf->out = false; + $this->pdf->MultiCell(140, 4, $title, "LTR", "L", 1); + $y2 = $this->pdf->GetY(); + $h = $y2 - $y; + $this->pdf->out = true; + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + $this->pdf->Cell(0, $h, "", "LTR", 1, "R", 1); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + $this->pdf->Cell(0, 4, $t, "", 1, "R"); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + $this->pdf->MultiCell(140, 4, $title, "", "L"); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y = $y2); + + $this->pdf->SetLeftMargin($lmargin + 55); + $this->pdf->SetY($y + 2); + + if ($fimg) { + $y = $this->pdf->GetY(); + $this->pdf->Image($fimg, $lmargin, $y, $finalWidth, $finalHeight); + $this->pdf->SetY($y + 3); + } + + $nf = 0; + $this->pdf->SetX($lmargin + 55); + $p0 = $this->pdf->PageNo(); + $y0 = $this->pdf->GetY(); + foreach ($rec->get_caption()->get_fields() as $field) { + /* @var $field caption_field */ + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $field->get_name() . " : "); + + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + $this->pdf->Write(5, $field->get_serialized_values()); + + $this->pdf->Write(6, "\n"); + $nf++; + } + if ($this->pdf->PageNo() == $p0 && ($this->pdf->GetY() - $y0) < $finalHeight) + $this->pdf->SetY($y0 + $finalHeight); + $ndoc++; + } + $this->pdf->SetLeftMargin($lmargin); + } + + protected function print_caption() + { + $this->pdf->AddPage(); + $oldMargins = $this->pdf->getMargins(); + + $lmargin = $oldMargins['left']; + $rmargin = $oldMargins['right']; + + foreach ($this->records as $rec) { + $title = "record : " . $rec->get_title(); + + $y = $this->pdf->GetY(); + if($this->pdf->getPageHeight() - $y < 20){ // height of the footer is 15 + $this->pdf->AddPage(); + $y = $oldMargins['top']; + } + + $t = \phrasea::bas_labels($rec->getBaseId(), $this->app); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 10); + $this->pdf->SetFillColor(220, 220, 220); + $this->pdf->SetLeftMargin($lmargin); + $this->pdf->SetRightMargin($rmargin); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + + $this->pdf->out = false; + $this->pdf->MultiCell(140, 4, $title, "LTR", "L", 1); + $y2 = $this->pdf->GetY(); + $h = $y2 - $y; + $this->pdf->out = true; + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + $this->pdf->Cell(0, $h, "", "LTR", 1, "R", 1); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + $this->pdf->Cell(0, 4, $t, "", 1, "R"); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y); + $this->pdf->MultiCell(140, 4, $title, "", "L"); + $this->pdf->SetX($lmargin); + $this->pdf->SetY($y = $y2); + $this->pdf->SetY($y + 2); + + foreach ($rec->get_caption()->get_fields() as $field) { + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $field->get_name() . " : "); + + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + $t = str_replace( + ["<", ">", "&"] + , ["<", ">", "&"] + , strip_tags($field->get_serialized_values()) + ); + $this->pdf->Write(5, $t); + + $this->pdf->Write(6, "\n"); + } + $this->pdf->SetY($this->pdf->GetY() + 10); + } + } + + + protected function print_preview($withtdm, $write_caption, $withfeedback) + { + $basket = $validation = null; + + if($this->printer->is_basket()) { + $basket = $this->printer->get_original_basket(); + + if($withfeedback) { + // first page : validation informations + $validation = $basket->getValidation(); + + $this->pdf->AddPage(); + + $this->pdf->SetY(20); + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 14); + $this->pdf->Cell(0, 0, + $this->app->trans("print_feedback:: Feedback on basket %name%", ['%name%'=>$basket->getName()]), + '', 1, 'C', false); + + $this->pdf->SetY($this->pdf->GetY()+10); + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $this->app->trans("print_feedback:: Document generated on : ")); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + $this->pdf->Write(5, $this->app['date-formatter']->getDate(new \DateTime('now'))); + $this->pdf->Write(12, "\n"); + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $this->app->trans("print_feedback:: Feedback initiated by : ")); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + $this->pdf->Write(5, $validation->getInitiator()->getLogin()); + $this->pdf->Write(6, "\n"); + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $this->app->trans("print_feedback:: Feedback initiated on : ")); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + $this->pdf->Write(5, $this->app['date-formatter']->getDate($validation->getCreated())); + $this->pdf->Write(6, "\n"); + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $this->app->trans("print_feedback:: Feedback expiring on : ")); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + $this->pdf->Write(5, $this->app['date-formatter']->getDate($validation->getExpires())); + $this->pdf->Write(12, "\n"); + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $this->app->trans("print_feedback:: Feedback " . ($validation->isFinished() ? "expired" : "active"))); + $this->pdf->Write(12, "\n"); + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $this->app->trans("print_feedback:: Participants : ")); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + foreach ($validation->getParticipants() as $participant) { + $this->pdf->Write(5, "\n - " . $participant->getUser()->getLogin()); + } + } + } + + if ($withtdm === true) { + $this->print_thumbnailGrid($this->pdf, $this->records, true); + } + + foreach ($this->records as $krec => $rec) { + /* @var \record_adapter $rec */ + + $this->pdf->AddPage(); + + if ($withtdm === "CALCPAGES") { + $rec->setNumber($this->pdf->PageNo()); + } + $lmargin = $this->pdf->GetX(); + $himg = 0; + $y = 0; + $miniConv = NULL; + + $LEFT__TEXT = ""; + $LEFT__IMG = NULL; + $RIGHT_TEXT = ""; + $RIGHT_IMG = NULL; + + $LEFT__IMG = $this->app['root.path'] . "/config/minilogos/logopdf_" . $rec->getDataboxId() . ".jpg"; + + if (!is_file($LEFT__IMG)) { + $databox = $rec->getDatabox(); + $str = $databox->get_sxml_structure(); + $vn = (string) ($str->pdfPrintLogo); + if (($vn * 1) == 1) { + $LEFT__TEXT = $databox->get_label($this->app['locale']); + } + } + + $collection = \collection::getByBaseId($this->app, $rec->getBaseId()); + + $vn = ""; + if (false !== $str = simplexml_load_string($collection->get_prefs())) { + $vn = (string) ($str->pdfPrintappear); + } + + if ($vn == "" || $vn == "1") { + $RIGHT_TEXT = \phrasea::bas_labels($rec->getBaseId(), $this->app); + } elseif ($vn == "2") { + $RIGHT_IMG = $this->app['root.path'] . "/config/minilogos/" . $rec->getBaseId(); + } + + $xtmp = $this->pdf->GetX(); + $ytmp = $this->pdf->GetY(); + + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + $this->pdf->SetFillColor(220, 220, 220); + $y = $this->pdf->GetY(); + $this->pdf->MultiCell(95, 7, $LEFT__TEXT, "LTB", "L", 1); + $y2 = $this->pdf->GetY(); + $h = $y2 - $y; + $this->pdf->SetY($y); + $this->pdf->SetX(105); + $this->pdf->Cell(95, $h, $RIGHT_TEXT, "TBR", 1, "R", 1); + + if($basket) { + $ord = $basket->getElementByRecord($this->app, $rec)->getOrd(); + $this->pdf->SetY($y); + $this->pdf->SetX(10); + $this->pdf->Cell(190, $h, '#' . $ord, "", 1, "C", 0); + } + + if ($LEFT__TEXT == "" && is_file($LEFT__IMG)) { + if ($size = @getimagesize($LEFT__IMG)) { + $wmm = (int) $size[0] * 25.4 / 72; + $hmm = (int) $size[1] * 25.4 / 72; + if ($hmm > 6) { + $coeff = $hmm / 6; + $wmm = (int) $wmm / $coeff; + $hmm = (int) $hmm / $coeff; + } + $this->pdf->Image($LEFT__IMG, $xtmp + 0.5, $ytmp + 0.5, $wmm, $hmm); + } + } + + if ($RIGHT_IMG != NULL && is_file($RIGHT_IMG)) { + if ($size = @getimagesize($RIGHT_IMG)) { + + if ($size[2] == '1') { + if (!isset($miniConv[$RIGHT_IMG])) { + $tmp_filename = tempnam('minilogos/', 'gif4fpdf'); + $img = imagecreatefromgif($RIGHT_IMG); + imageinterlace($img, 0); + imagepng($img, $tmp_filename); + rename($tmp_filename, $tmp_filename . '.png'); + $miniConv[$RIGHT_IMG] = $tmp_filename . '.png'; + $RIGHT_IMG = $tmp_filename . '.png'; + } else + $RIGHT_IMG = $miniConv[$RIGHT_IMG]; + + $wmm = (int) $size[0] * 25.4 / 72; + $hmm = (int) $size[1] * 25.4 / 72; + if ($hmm > 6) { + $coeff = $hmm / 6; + $wmm = (int) $wmm / $coeff; + $hmm = (int) $hmm / $coeff; + } + $tt = 0; + if ($hmm < 6) + $tt = (6 - $hmm) / 2; + $this->pdf->Image($RIGHT_IMG, 200 - 0.5 - $wmm, $ytmp + 0.5 + $tt); + } else { + $wmm = (int) $size[0] * 25.4 / 72; + $hmm = (int) $size[1] * 25.4 / 72; + if ($hmm > 6) { + $coeff = $hmm / 6; + $wmm = (int) $wmm / $coeff; + $hmm = (int) $hmm / $coeff; + } + $this->pdf->Image($RIGHT_IMG, 200 - 0.5 - $wmm, $ytmp + 0.5); + } + } + } + + $y = $this->pdf->GetY() + 5; + + $subdef = $rec->get_subdef('preview'); + + if ($subdef->get_type() !== \media_subdef::TYPE_IMAGE) { + $subdef = $rec->get_thumbnail(); + } + + $f = $subdef->getRealPath(); + + if (!$this->app->getAclForUser($this->app->getAuthenticatedUser())->has_right_on_base($rec->getBaseId(), \ACL::NOWATERMARK) + && $subdef->get_type() == \media_subdef::TYPE_IMAGE) + $f = \recordutils_image::watermark($this->app, $subdef); + + // original height / original width x new width = new height + $wimg = $himg = 150; // preview dans un carre de 150 mm + // 1px = 3.77952 mm + $finalWidth = round($subdef->get_width() / 3.779528, 2); + $finalHeight = round($subdef->get_height() / 3.779528, 2); + $aspectH = $finalWidth/$finalHeight; + $aspectW = $finalHeight/$finalWidth; + + if ($finalWidth > 0 && $finalHeight > 0) { + if ($finalWidth > $finalHeight && $finalWidth > $wimg) { + $finalWidth = $wimg; + $finalHeight = $wimg * $aspectW; + } else if ($finalHeight > $finalWidth && $finalHeight > $himg) { + $finalHeight = $himg; + $finalWidth = $himg * $aspectH; + } else if ($finalHeight == $finalWidth & $finalWidth > $wimg) { + $finalHeight = $wimg; + $finalWidth = $himg; + } + } + + $this->pdf->Image($f, (210 - $finalWidth) / 2, $y, $finalWidth, $finalHeight); + + if ($miniConv != NULL) { + foreach ($miniConv as $oneF) + unlink($oneF); + } + $this->pdf->SetXY($lmargin, $y += ( $finalHeight + 5)); + + $nf = 0; + if ($write_caption) { + foreach ($rec->get_caption()->get_fields() as $field) { + /* @var $field caption_field */ + if ($nf > 0) { + $this->pdf->Write(6, "\n"); + } + + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $field->get_name() . " : "); + + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + + $t = str_replace( + ["<", ">", "&"] + , ["<", ">", "&"] + , strip_tags($field->get_serialized_values()) + ); + + $this->pdf->Write(5, $t); + + $nf++; + } + } + + if($basket && $validation) { + /** @var ValidationParticipant $participant */ + + if ($nf > 0) { + $this->pdf->Write(6, "\n"); + } + $this->pdf->SetFont(PhraseaPDF::FONT, 'B', 12); + $this->pdf->Write(5, $this->app->trans("print_feedback:: Votes :")); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + + $basketElement = $basket->getElementByRecord($this->app, $rec); + + $iparticipant = 0; + foreach ($validation->getParticipants() as $participant) { + $this->pdf->Write(6, "\n"); + if($iparticipant++ > 0) { + // $this->pdf->SetY($this->pdf->GetY()+1); + } + $validationData = $basketElement->getUserValidationDatas($participant->getUser()); + + $this->pdf->Write(5, '- ' . $participant->getUser()->getLogin() . " : "); + + $r = $validationData->getAgreement(); + $this->pdf->SetX(100); + if ($r === null) { + $this->pdf->Write(0, $this->app->trans("print_feedback:: non voté")); + } + else { + if($r) { + $this->pdf->SetTextColor(0, 127, 0); + $this->pdf->Write(0, $this->app->trans("print_feedback:: Oui")); + } + else { + $this->pdf->SetTextColor(200, 0, 0); + $this->pdf->Write(0, $this->app->trans("print_feedback:: Non")); + } + $this->pdf->SetTextColor(0); + $this->pdf->Write(0, " (" . $this->app['date-formatter']->getDate($validationData->getUpdated()) . ")"); + } + + if (($note = (string)($validationData->getNote())) !== '') { + $this->pdf->SetFont(PhraseaPDF::FONT, 'I', 11); + $this->pdf->Write(5,"\n"); + $this->pdf->SetX(100); + $this->pdf->MultiCell(95, 0, $note, '', "L", false); + $this->pdf->SetFont(PhraseaPDF::FONT, '', 12); + } + + $nf++; + } + } + } + + return; + } + + private function formatDate(DateTime $d) + { + // todo + } + +} diff --git a/templates/web/prod/actions/printer_default.html.twig b/templates/web/prod/actions/printer_default.html.twig index 880653f822..e3833c0f7d 100644 --- a/templates/web/prod/actions/printer_default.html.twig +++ b/templates/web/prod/actions/printer_default.html.twig @@ -2,6 +2,17 @@
+ {% if basketFeedbackId %} +

{{ 'phraseanet:: basket feedback' | trans }}

+ +
+ +
+ {% endif %} + {% if printer.get_count_actionable() > 0 %} {% if printer.get_count_preview() > 0 %}

{{ 'phraseanet:: preview' | trans }}