additional fixes
authordeb.monish <monish.deb@webaccessglobal.com>
Wed, 1 Jun 2016 06:21:29 +0000 (11:51 +0530)
committerdeb.monish <monish.deb@webaccessglobal.com>
Thu, 14 Jul 2016 18:05:43 +0000 (23:35 +0530)
CRM/Admin/Form/MessageTemplates.php
CRM/Contact/Form/Task/PDFLetterCommon.php
CRM/Core/BAO/File.php
CRM/Core/BAO/MessageTemplate.php
CRM/Core/SelectValues.php
CRM/Mailing/Page/AJAX.php
CRM/Upgrade/Incremental/sql/4.7.9.mysql.tpl
CRM/Utils/PDF/Document.php
templates/CRM/Contact/Form/Task/PDFLetterCommon.tpl
templates/CRM/Mailing/Form/InsertTokens.tpl
xml/templates/civicrm_data.tpl

index f4d995eb32f0baa66d4c6cc28192d5772d178de5..e5bf6c79029cb5c4c59b000b03bd815c31c14ed3 100644 (file)
@@ -38,7 +38,9 @@
 class CRM_Admin_Form_MessageTemplates extends CRM_Admin_Form {
   // which (and whether) mailing workflow this template belongs to
   protected $_workflow_id = NULL;
-  protected $_documentID = NULL;
+
+  // document ID set during loading default values and later used in formRule
+  protected $_document_id = NULL;
 
   public function preProcess() {
     $this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this);
@@ -89,7 +91,7 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Admin_Form {
         foreach ($documentInfo as &$info) {
           $defaults['file_type'] = array_search($info['mime_type'], CRM_Core_SelectValues::documentApplicationType());
           $info['mime_type'] = $defaults['file_type'];
-          $this->_documentID = $info['fileID'];
+          $this->_document_id = $info['fileID'];
         }
         $this->assign('attachment', $documentInfo);
       }
@@ -168,7 +170,6 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Admin_Form {
     $this->add('text', 'msg_title', ts('Message Title'), CRM_Core_DAO::getAttribute('CRM_Core_DAO_MessageTemplate', 'msg_title'), TRUE);
 
     $this->add('select', 'file_type', ts('File Type'), CRM_Core_SelectValues::documentFormat());
-
     $this->addElement('file', "file_id", ts('Upload Document'), 'size=30 maxlength=60');
     $this->addUploadElement("file_id");
 
@@ -227,10 +228,11 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Admin_Form {
   /**
    * Global form rule.
    *
-   * @param array $fields
+   * @param array $params
    *   The input form values.
    * @param array $files
    *   The uploaded files if any.
+   * @param array $self
    *
    * @return array
    *   array of errors
@@ -241,9 +243,9 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Admin_Form {
     //empty file upload validation for odt/docx template
     if (empty($files['file_id']['tmp_name']) && in_array($params['file_type'], array('odt', 'docx'))) {
       //On edit page of docx/odt message template if user changes file type but forgot to upload document
-      if (!empty($self->_documentID)) {
+      if (!empty($self->_document_id)) {
         $fileDAO = new CRM_Core_DAO_File();
-        $fileDAO->id = $self->_documentID;
+        $fileDAO->id = $self->_document_id;
         if ($fileDAO->find(TRUE) &&
           $fileDAO->mime_type != CRM_Utils_Array::value($params['file_type'], CRM_Core_SelectValues::documentApplicationType())
         ) {
index fecc8fa6f1b85c6bc7ae7bebbba0483d6c149d9f..667b4f3aa3cc33e034920fec4607cafe58f428b6 100644 (file)
@@ -252,6 +252,8 @@ class CRM_Contact_Form_Task_PDFLetterCommon {
   static protected function processMessageTemplate(&$form) {
     $formValues = $form->controller->exportValues($form->getName());
 
+    $html_message = $formValues['html_message'];
+
     // process message template
     if (!empty($formValues['saveTemplate']) || !empty($formValues['updateTemplate'])) {
       $messageTemplate = array(
@@ -285,6 +287,12 @@ class CRM_Contact_Form_Task_PDFLetterCommon {
         $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) {
+        $docType = array_search($info['mime_type'], CRM_Core_SelectValues::documentApplicationType());
+        $html_message = CRM_Utils_PDF_Document::docReader($info['fullPath'], $docType, TRUE);
+      }
     }
     if (!empty($formValues['update_format'])) {
       $bao = new CRM_Core_BAO_PdfFormat();
@@ -297,8 +305,6 @@ class CRM_Contact_Form_Task_PDFLetterCommon {
     CRM_Utils_Hook::tokens($tokens);
     $categories = array_keys($tokens);
 
-    $html_message = $formValues['html_message'];
-
     //time being hack to strip '&nbsp;'
     //from particular letter line, CRM-6798
     self::formatMessage($html_message);
index 8f1fcf6bdb257a27c43b9637cf3c04cb5aebbd0d..b6deb13ace499954fcc98701cae64f9632d8fde6 100644 (file)
@@ -170,8 +170,6 @@ class CRM_Core_BAO_File extends CRM_Core_DAO_File {
 
     // lets call the post hook here so attachments code can do the right stuff
     CRM_Utils_Hook::post($op, 'File', $fileDAO->id, $fileDAO);
-
-    return $fileDAO;
   }
 
   /**
index 4df5bed66640d31867bfa9831feadcba9bf18946..45ebaeabf9772386dd795c0da996080aced9390b 100644 (file)
@@ -97,7 +97,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
 
     if (!empty($fileParams)) {
       $params['file_id'] = $fileParams;
-      $fileDao = CRM_Core_BAO_File::filePostProcess(
+      CRM_Core_BAO_File::filePostProcess(
         $params['file_id']['location'],
         NULL,
         'civicrm_msg_template',
@@ -108,8 +108,6 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
         'file_id',
         $params['file_id']['type']
       );
-
-      $messageTemplates->save();
     }
 
     CRM_Utils_Hook::post($hook, 'MessageTemplate', $messageTemplates->id, $messageTemplates);
index 005b13086a16307914f18c3db3455aac6b75e51a..af7f6510b86ce529a3b753bfe5fe06ddefdca12a 100644 (file)
@@ -1099,5 +1099,4 @@ class CRM_Core_SelectValues {
     );
   }
 
-
 }
index 799c71953b0c61559274b0df0c1f8a8c99ac2a5e..a02aadb7b6fab6f56f88d4cded8823ec1d14468e 100644 (file)
@@ -57,7 +57,7 @@ class CRM_Mailing_Page_AJAX {
     $documentInfo = CRM_Core_BAO_File::getEntityFile('civicrm_msg_template', $templateId);
     foreach ((array) $documentInfo as $info) {
       $messages['file_type'] = array_search($info['mime_type'], CRM_Core_SelectValues::documentApplicationType());
-      $messages['document_path'] = $info['fullPath'];
+      $messages['document_path'] = CRM_Utils_PDF_Document::docReader($info['fullPath'], $messages['file_type']);
       $messages['mime_type'] = $info['mime_type'];
     }
 
index 3be47b33cb8cb7c58a1467b34defa973c08fc571..c2e5cfd4d085e4e0631cc06fc76be162acdce06c 100644 (file)
@@ -7,6 +7,15 @@ UPDATE civicrm_option_value SET
   {localize field="description"}description = '{ts escape="sql"}Export letters and other printable documents.{/ts}'{/localize}
 WHERE name = 'Print PDF Letter' AND option_group_id = @option_group_id_act;
 
+-- CRM-17608 Merge to DOCx or ODT template
+SELECT @option_group_id_ext := max(id) from civicrm_option_group where name = 'safe_file_extension';
+SELECT @option_group_id_ext_wt  := MAX(weight) FROM civicrm_option_value WHERE option_group_id = @option_group_id_ext;
+SELECT @option_group_id_ext_val := MAX(CAST( `value` AS UNSIGNED )) FROM civicrm_option_value WHERE option_group_id = @option_group_id_ext;
+INSERT INTO
+   `civicrm_option_value` (`option_group_id`, {localize field='label'}label{/localize}, `value`, `name`, `grouping`, `filter`, `is_default`, `weight`, `is_optgroup`, `is_reserved`, `is_active`)
+VALUES
+(@option_group_id_ext, {localize}'{ts escape="sql"}odt{/ts}'{/localize}, @option_group_id_ext_val+1, 'odt', NULL, 0, 0, @option_group_id_ext_wt+1, 0, 1, 1);
+
 -- CRM-18699 Fix Wake Island misspelling, was Wake Ialand
 UPDATE civicrm_state_province SET name="Wake Island" WHERE name="Wake Ialand";
 
index 4dba35403f7882db2adb08c8915e6e48b6e230e9..3fc6d9c701f9f275f58bec6d6ee8909d9c430de6 100644 (file)
@@ -95,8 +95,63 @@ class CRM_Utils_PDF_Document {
     return \PhpOffice\PhpWord\Shared\Converter::pointToTwip($point);
   }
 
-  public static function docReader($path) {
-    return \PhpOffice\PhpWord\IOFactory::load($path);
+  /**
+   * @param array $path  docx/odt file path
+   * @param string $type  File type
+   * @param bool $returnContent extract content of docx/odt file as a text, later used for token replacement
+   *
+   * @return string
+   *    Return filepath of created html copy of document OR extracted content of document
+   */
+  public static function docReader($path, $type, $returnContent = FALSE) {
+    if ($returnContent) {
+      return self::doc2Text($path, $type);
+    }
+
+    $newpath = str_replace('.' . $type, '.html', $path);
+    $fileType = ($type == 'docx') ? 'Word2007' : 'ODText';
+    if (!file_exists($newpath)) {
+      $phpWord = \PhpOffice\PhpWord\IOFactory::load($path, $fileType);
+      $phpWord->save($newpath, 'HTML');
+    }
+
+    $relPath = str_replace('/Users/monish/www/civicrm-master/', CRM_Utils_System::baseURL(), $newpath);
+    return $relPath;
+  }
+
+  /**
+   * Extract content of docx/odt file as text and later used for token replacement
+   * @param string $filePath Document file path
+   * @param string $type File type of document
+   *
+   * @return string
+   *   File content of document as text
+   */
+  public static function doc2Text($filePath, $type) {
+    $content = '';
+
+    $zip = zip_open($filePath);
+    $dataFile = ($type == 'docx') ? "word/document.xml" : "content.xml";
 
+    if (!$zip || is_numeric($zip)) {
+      return $content;
+    }
+
+    while ($zip_entry = zip_read($zip)) {
+      if (zip_entry_open($zip, $zip_entry) == FALSE || zip_entry_name($zip_entry) != $dataFile) {
+        continue;
+      }
+      $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
+      zip_entry_close($zip_entry);
+    }
+
+    zip_close($zip);
+
+    $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
+    $content = str_replace('</w:r></w:p>', "\r\n", $content);
+    $striped_content = strip_tags($content);
+
+    return nl2br($striped_content);
   }
+
 }
index 97e033548c2af141f8ba1682346f8a9756459fa5..f7560b2fe5ac2bf27ac22a5fce0dcaec8d2b5b78 100644 (file)
   </div>
 </div>
 
+<div class="crm-accordion-wrapper crm-document-accordion ">
+  <div class="crm-accordion-header">
+    {$form.html_message.label}
+  </div><!-- /.crm-accordion-header -->
+  <div class="crm-accordion-body">
+    <div id='document'></div>
+  </div><!-- /.crm-accordion-body -->
+</div><!-- /.crm-accordion-wrapper -->
+
 <div class="crm-accordion-wrapper crm-html_email-accordion ">
 <div class="crm-accordion-header">
     {$form.html_message.label}
 <script type="text/javascript">
 CRM.$(function($) {
   var $form = $('form.{/literal}{$form.formClass}{literal}');
+
+  {/literal}{if $form.formName eq 'PDF'}{literal}
+    cj('.crm-document-accordion').hide();
+  {/literal}{/if}{literal}
+
+
   $('#format_id', $form).on('change', function() {
     selectFormat($(this).val());
   });
index 75a18fc4192a63d92322d51b528ffc1d75f9d6e2..a5252b848026710f6736adee5c022908d881c8a0 100644 (file)
@@ -109,6 +109,9 @@ function selectValue( val, prefix) {
   document.getElementsByName(prefix + "updateTemplate")[0].checked = false;
   showSaveUpdateChkBox(prefix);
   if ( !val ) {
+    if (document.getElementById("subject").length) {
+      document.getElementById("subject").value ="";
+    }
     if (document.getElementById("subject").length) {
       document.getElementById("subject").value ="";
     }
@@ -121,6 +124,11 @@ function selectValue( val, prefix) {
         document.getElementById("text_message").value ="";
       }
     }
+    else {
+      cj('.crm-html_email-accordion').show();
+      cj('.crm-document-accordion').hide();
+    }
+
     CRM.wysiwyg.setVal('#' + html_message, '');
     if ( isPDF ) {
       showBindFormatChkBox();
@@ -131,19 +139,21 @@ function selectValue( val, prefix) {
   var dataUrl = {/literal}"{crmURL p='civicrm/ajax/template' h=0 }"{literal};
 
   cj.post( dataUrl, {tid: val}, function( data ) {
-    if (data.document_path) {
-      cj("#document").attr('data', data.document_path);
-      cj("#document").attr('type', data.mime_type);
-      cj("#document embed").attr('type', data.mime_type);
-      cj('#document embed').attr('src', data.document_path);
-      console.log(data.document_path);
+    var hide = (data.document_path && isPDF) ? false : true;
+    cj('.crm-html_email-accordion').toggle(hide);
+    cj('.crm-document-accordion').toggle(!hide);
+
+    if (!hide) {
+      cj("#document_type").val( data.file_type );
+      cj("#subject").val( data.subject );
+      document.getElementById("document").innerHTML='<object type="text/html" data='+ data.document_path +' width="680" height="400" style="background:white;"></object>';
+      return;
     }
 
     if ( !isPDF ) {
       if (prefix == "SMS") {
           text_message = "sms_text_message";
       }
-
       if ( data.msg_text ) {
         cj("#"+text_message).val( data.msg_text );
         cj("div.text").show();
index cd1b9a393128b469cd16379e03076367fdfafcea..920b5180c7fd57862f9877d1e17dc46cad6cb39b 100644 (file)
@@ -673,6 +673,7 @@ VALUES
   (@option_group_id_sfe, 'ppt',  11, 'ppt',   NULL, 0, 0, 11, NULL, 0, 0, 1, NULL, NULL),
   (@option_group_id_sfe, 'docx', 12, 'docx',  NULL, 0, 0, 12, NULL, 0, 0, 1, NULL, NULL),
   (@option_group_id_sfe, 'xlsx', 13, 'xlsx',  NULL, 0, 0, 13, NULL, 0, 0, 1, NULL, NULL),
+  (@option_group_id_sfe, 'odt',  14, 'odt',   NULL, 0, 0, 14, NULL, 0, 0, 1, NULL, NULL),
 
   (@option_group_id_we, '{ts escape="sql"}Textarea{/ts}', 1, 'Textarea', NULL, 0, NULL, 1, NULL, 0, 1, 1, NULL, NULL),
   (@option_group_id_we, 'CKEditor', 2, 'CKEditor', NULL, 0, NULL, 2, NULL, 0, 1, 1, NULL, NULL),