preventAjaxSubmit(); //Added for CRM-12682: Add activity subject and campaign fields CRM_Campaign_BAO_Campaign::addCampaign($form); $form->add( 'text', 'subject', ts('Activity Subject'), ['size' => 45, 'maxlength' => 255], FALSE ); $form->add('static', 'pdf_format_header', NULL, ts('Page Format: %1', [1 => ''])); $form->addSelect('format_id', [ 'label' => ts('Select Format'), 'placeholder' => ts('Default'), 'entity' => 'message_template', 'field' => 'pdf_format_id', 'option_url' => 'civicrm/admin/pdfFormats', ]); $form->add( 'select', 'paper_size', ts('Paper Size'), [0 => ts('- default -')] + CRM_Core_BAO_PaperSize::getList(TRUE), FALSE, ['onChange' => "selectPaper( this.value ); showUpdateFormatChkBox();"] ); $form->add('static', 'paper_dimensions', NULL, ts('Width x Height')); $form->add( 'select', 'orientation', ts('Orientation'), CRM_Core_BAO_PdfFormat::getPageOrientations(), FALSE, ['onChange' => "updatePaperDimensions(); showUpdateFormatChkBox();"] ); $form->add( 'select', 'metric', ts('Unit of Measure'), CRM_Core_BAO_PdfFormat::getUnits(), FALSE, ['onChange' => "selectMetric( this.value );"] ); $form->add( 'text', 'margin_left', ts('Left Margin'), ['size' => 8, 'maxlength' => 8, 'onkeyup' => "showUpdateFormatChkBox();"], TRUE ); $form->add( 'text', 'margin_right', ts('Right Margin'), ['size' => 8, 'maxlength' => 8, 'onkeyup' => "showUpdateFormatChkBox();"], TRUE ); $form->add( 'text', 'margin_top', ts('Top Margin'), ['size' => 8, 'maxlength' => 8, 'onkeyup' => "showUpdateFormatChkBox();"], TRUE ); $form->add( 'text', 'margin_bottom', ts('Bottom Margin'), ['size' => 8, 'maxlength' => 8, 'onkeyup' => "showUpdateFormatChkBox();"], TRUE ); $config = CRM_Core_Config::singleton(); /** CRM-15883 Suppressing Stationery path field until we switch from DOMPDF to a library that supports it. * if ($config->wkhtmltopdfPath == FALSE) { * $form->add( * 'text', * 'stationery', * ts('Stationery (relative path to PDF you wish to use as the background)'), * array('size' => 25, 'maxlength' => 900, 'onkeyup' => "showUpdateFormatChkBox();"), * FALSE * ); * } */ $form->add('checkbox', 'bind_format', ts('Always use this Page Format with the selected Template')); $form->add('checkbox', 'update_format', ts('Update Page Format (this will affect all templates that use this format)')); $form->assign('useThisPageFormat', ts('Always use this Page Format with the new template?')); $form->assign('useSelectedPageFormat', ts('Should the new template always use the selected Page Format?')); $form->assign('totalSelectedContacts', count($form->_contactIds)); $form->add('select', 'document_type', ts('Document Type'), CRM_Core_SelectValues::documentFormat()); $documentTypes = implode(',', CRM_Core_SelectValues::documentApplicationType()); $form->addElement('file', "document_file", 'Upload Document', 'size=30 maxlength=255 accept="' . $documentTypes . '"'); $form->addUploadElement("document_file"); CRM_Mailing_BAO_Mailing::commonCompose($form); $buttons = []; if ($form->get('action') != CRM_Core_Action::VIEW) { $buttons[] = [ 'type' => 'upload', 'name' => ts('Download Document'), 'isDefault' => TRUE, 'icon' => 'fa-download', ]; $buttons[] = [ 'type' => 'submit', 'name' => ts('Preview'), 'subName' => 'preview', 'icon' => 'fa-search', 'isDefault' => FALSE, ]; } $buttons[] = [ 'type' => 'cancel', 'name' => $form->get('action') == CRM_Core_Action::VIEW ? ts('Done') : ts('Cancel'), ]; $form->addButtons($buttons); $form->addFormRule(['CRM_Core_Form_Task_PDFLetterCommon', 'formRule'], $form); } /** * Set default values. */ public static function setDefaultValues() { $defaultFormat = CRM_Core_BAO_PdfFormat::getDefaultValues(); $defaultFormat['format_id'] = $defaultFormat['id']; return $defaultFormat; } /** * Form rule. * * @param array $fields * The input form values. * @param array $files * @param array $self * Additional values form 'this'. * * @return bool * TRUE if no errors, else array of errors. */ public static function formRule($fields, $files, $self) { $errors = []; $template = CRM_Core_Smarty::singleton(); // If user uploads non-document file other than odt/docx if (empty($fields['template']) && !empty($files['document_file']['tmp_name']) && array_search($files['document_file']['type'], CRM_Core_SelectValues::documentApplicationType()) == NULL ) { $errors['document_file'] = ts('Invalid document file format'); } //Added for CRM-1393 if (!empty($fields['saveTemplate']) && empty($fields['saveTemplateName'])) { $errors['saveTemplateName'] = ts("Enter name to save message template"); } if (!is_numeric($fields['margin_left'])) { $errors['margin_left'] = 'Margin must be numeric'; } if (!is_numeric($fields['margin_right'])) { $errors['margin_right'] = 'Margin must be numeric'; } if (!is_numeric($fields['margin_top'])) { $errors['margin_top'] = 'Margin must be numeric'; } if (!is_numeric($fields['margin_bottom'])) { $errors['margin_bottom'] = 'Margin must be numeric'; } return empty($errors) ? TRUE : $errors; } /** * Handle the template processing part of the form */ public static function processTemplate(&$formValues) { $html_message = CRM_Utils_Array::value('html_message', $formValues); // process message template if (!empty($formValues['saveTemplate']) || !empty($formValues['updateTemplate'])) { $messageTemplate = [ 'msg_text' => NULL, 'msg_html' => $formValues['html_message'], 'msg_subject' => NULL, 'is_active' => TRUE, ]; $messageTemplate['pdf_format_id'] = 'null'; if (!empty($formValues['bind_format']) && $formValues['format_id']) { $messageTemplate['pdf_format_id'] = $formValues['format_id']; } if (!empty($formValues['saveTemplate']) && $formValues['saveTemplate']) { $messageTemplate['msg_title'] = $formValues['saveTemplateName']; CRM_Core_BAO_MessageTemplate::add($messageTemplate); } if (!empty($formValues['updateTemplate']) && $formValues['template'] && $formValues['updateTemplate']) { $messageTemplate['id'] = $formValues['template']; unset($messageTemplate['msg_title']); CRM_Core_BAO_MessageTemplate::add($messageTemplate); } } elseif (CRM_Utils_Array::value('template', $formValues) > 0) { if (!empty($formValues['bind_format']) && $formValues['format_id']) { $query = "UPDATE civicrm_msg_template SET pdf_format_id = {$formValues['format_id']} WHERE id = {$formValues['template']}"; } else { $query = "UPDATE civicrm_msg_template SET pdf_format_id = NULL WHERE id = {$formValues['template']}"; } CRM_Core_DAO::executeQuery($query); $documentInfo = CRM_Core_BAO_File::getEntityFile('civicrm_msg_template', $formValues['template']); foreach ((array) $documentInfo as $info) { list($html_message, $formValues['document_type']) = CRM_Utils_PDF_Document::docReader($info['fullPath'], $info['mime_type']); $formValues['document_file_path'] = $info['fullPath']; } } // extract the content of uploaded document file elseif (!empty($formValues['document_file'])) { list($html_message, $formValues['document_type']) = CRM_Utils_PDF_Document::docReader($formValues['document_file']['name'], $formValues['document_file']['type']); $formValues['document_file_path'] = $formValues['document_file']['name']; } if (!empty($formValues['update_format'])) { $bao = new CRM_Core_BAO_PdfFormat(); $bao->savePdfFormat($formValues, $formValues['format_id']); } return $html_message; } /** * @param $message */ public static function formatMessage(&$message) { $newLineOperators = [ 'p' => [ 'oper' => '

', 'pattern' => '/<(\s+)?p(\s+)?>/m', ], 'br' => [ 'oper' => '
', 'pattern' => '/<(\s+)?br(\s+)?\/>/m', ], ]; $htmlMsg = preg_split($newLineOperators['p']['pattern'], $message); foreach ($htmlMsg as $k => & $m) { $messages = preg_split($newLineOperators['br']['pattern'], $m); foreach ($messages as $key => & $msg) { $msg = trim($msg); $matches = []; if (preg_match('/^( )+/', $msg, $matches)) { $spaceLen = strlen($matches[0]) / 6; $trimMsg = ltrim($msg, '  '); $charLen = strlen($trimMsg); $totalLen = $charLen + $spaceLen; if ($totalLen > 100) { $spacesCount = 10; if ($spaceLen > 50) { $spacesCount = 20; } if ($charLen > 100) { $spacesCount = 1; } $msg = str_repeat(' ', $spacesCount) . $trimMsg; } } } $m = implode($newLineOperators['br']['oper'], $messages); } $message = implode($newLineOperators['p']['oper'], $htmlMsg); } }