setTitle('Print/Merge Document');
}
/**
* Build the form object.
*
* @deprecated
*
* @var CRM_Core_Form $form
* @throws \CRM_Core_Exception
*/
public static function buildQuickForm(&$form) {
CRM_Core_Error::deprecatedFunctionWarning('no supported alternative for non-core code');
// This form outputs a file so should never be submitted via ajax
$form->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
);
// Added for core#2121,
// To support sending a custom pdf filename before downloading.
$form->addElement('hidden', 'pdf_file_name');
$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(
'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', !is_null($form->_contactIds) ? count($form->_contactIds) : 0);
$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.
*
* @deprecated
*/
public static function setDefaultValues() {
CRM_Core_Error::deprecatedFunctionWarning('no alternative');
$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 = [];
$deprecatedTokens = [
'{case.status_id}' => '{case.status_id:label}',
'{case.case_type_id}' => '{case.case_type_id:label}',
'{membership.status}' => '{membership.status_id:label}',
'{membership.type}' => '{membership.membership_type_id:label}',
'{contribution.campaign}' => '{contribution.campaign_id:label}',
'{contribution.payment_instrument}' => '{contribution.payment_instrument_id:label}',
'{contribution.contribution_id}' => '{contribution.id}',
'{contribution.contribution_source}' => '{contribution.source}',
];
$tokenErrors = [];
foreach ($deprecatedTokens as $token => $replacement) {
if (strpos($fields['html_message'], $token) !== FALSE) {
$tokenErrors[] = ts('Token %1 is no longer supported - use %2 instead', [$token, $replacement]);
}
}
if (!empty($tokenErrors)) {
$errors['html_message'] = implode('
', $tokenErrors);
}
// 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
*
* @param array $formValues
*
* @return string $html_message
*
* @deprecated
*
* @throws \CRM_Core_Exception
* @throws \CiviCRM_API3_Exception
* @throws \Civi\API\Exception\UnauthorizedException
*/
public static function processTemplate(&$formValues) {
CRM_Core_Error::deprecatedFunctionWarning('no alternative');
$html_message = $formValues['html_message'] ?? NULL;
// 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'])) {
$messageTemplate['msg_title'] = $formValues['saveTemplateName'];
CRM_Core_BAO_MessageTemplate::add($messageTemplate);
}
if ($formValues['template'] && !empty($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) {
[$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'])) {
[$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;
}
/**
* @deprecated
*
* @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);
}
/**
* Render html from rows
*
* @param $rows
* @param string $msgPart
* The name registered with the TokenProcessor
* @param array $formValues
* The values submitted through the form
*
* @deprecated
*/
public static function renderFromRows($rows, $msgPart, $formValues): void {
CRM_Core_Error::deprecatedFunctionWarning('no alternative');
$html = [];
foreach ($rows as $row) {
$html[] = $row->render($msgPart);
}
if (!empty($html)) {
self::outputFromHtml($formValues, $html);
}
}
/**
* List the available tokens
* @return array of token name => label
*
* @deprecated
*/
public static function listTokens() {
CRM_Core_Error::deprecatedFunctionWarning('no alternative');
$class = get_called_class();
if (method_exists($class, 'createTokenProcessor')) {
return $class::createTokenProcessor()->listTokens();
}
}
/**
* Output the pdf or word document from the generated html.
*
* @deprecated
*
* @param array $formValues
* @param array $html
*/
protected static function outputFromHtml($formValues, array $html) {
CRM_Core_Error::deprecatedFunctionWarning('no alternative');
// Set the filename for the PDF using the Activity Subject, if defined. Remove unwanted characters and limit the length to 200 characters.
if (!empty($formValues['subject'])) {
$fileName = CRM_Utils_File::makeFilenameWithUnicode($formValues['subject'], '_', 200);
}
else {
$fileName = 'CiviLetter';
}
if ($formValues['document_type'] === 'pdf') {
CRM_Utils_PDF_Utils::html2pdf($html, $fileName . '.pdf', FALSE, $formValues);
}
else {
CRM_Utils_PDF_Document::html2doc($html, $fileName . '.' . $formValues['document_type'], $formValues);
}
}
}