CRM-16352: Allow to define the language of Mailings (for tokens).
authorMathieu Lutfy <mathieu@bidon.ca>
Sat, 25 Jul 2015 15:07:01 +0000 (11:07 -0400)
committerSamuel Vanhove <samuel@symbiotic.coop>
Thu, 6 Oct 2016 14:38:00 +0000 (10:38 -0400)
CRM/Mailing/BAO/Mailing.php
CRM/Mailing/Form/Search.php
CRM/Mailing/Info.php
CRM/Mailing/Selector/Browse.php
CRM/Mailing/Selector/Search.php
ang/crmMailing/BlockMailing.html
ang/crmMailing/BlockReview.html
templates/CRM/Mailing/Form/Search.tpl
xml/schema/Mailing/Mailing.xml

index 4049a5367f6a8024cc251e8bf2aed8e9450c6f4f..fe4b9ec3b6fb141869a6c552b0dffe4f92347804 100644 (file)
@@ -2518,6 +2518,7 @@ LEFT JOIN civicrm_mailing_group g ON g.mailing_id   = m.id
       "$mailing.approval_status_id", "createdContact.sort_name as created_by", "scheduledContact.sort_name as scheduled_by",
       "$mailing.created_id as created_id", "$mailing.scheduled_id as scheduled_id", "$mailing.is_archived as archived",
       "$mailing.created_date as created_date", "campaign_id", "$mailing.sms_provider_id as sms_provider_id",
+      "$mailing.language"
     );
 
     // we only care about parent jobs, since that holds all the info on
@@ -2579,6 +2580,7 @@ LEFT JOIN civicrm_mailing_group g ON g.mailing_id   = m.id
         'campaign_id' => $dao->campaign_id,
         'campaign' => empty($dao->campaign_id) ? NULL : $allCampaigns[$dao->campaign_id],
         'sms_provider_id' => $dao->sms_provider_id,
+        'language' => $dao->language,
       );
     }
     return $rows;
index ad434b966a0e7191b6fa36de5dd45ae6e01afd64..b91a85891d286c29d88fe275d7bc7c74bcb5e02b 100644 (file)
@@ -60,6 +60,13 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form {
     $this->addElement('checkbox', 'status_unscheduled', NULL, ts('Draft / Unscheduled'));
     $this->addYesNo('is_archived', ts('Mailing is Archived'), TRUE);
 
+    // Search by language, if multi-lingual
+    $enabledLanguages = CRM_Core_I18n::languages(TRUE);
+
+    if (count($enabledLanguages) > 1) {
+      $this->addElement('select', 'language', ts('Language'), array('' => ' - all languages - ') + $enabledLanguages, array('class' => 'crm-select2'));
+    }
+
     if ($parent->_sms) {
       $this->addElement('hidden', 'sms', $parent->_sms);
     }
@@ -118,6 +125,7 @@ class CRM_Mailing_Form_Search extends CRM_Core_Form {
         'sms',
         'status_unscheduled',
         'is_archived',
+        'language',
         'hidden_find_mailings',
       );
       foreach ($fields as $field) {
index 1fdd0e27b12ccec93a87e7224fabb1197edbbb1b..3444383c03a7225ff120d8da3432ea95df1c84db 100644 (file)
@@ -161,6 +161,8 @@ class CRM_Mailing_Info extends CRM_Core_Component_Info {
       'option_group_id' => "from_email_address",
       'domain_id' => CRM_Core_Config::domainID(),
     ));
+    $enabledLanguages = CRM_Core_I18n::languages(TRUE);
+    $isMultiLingual = (count($enabledLanguages) > 1);
     CRM_Core_Resources::singleton()
       ->addSetting(array(
         'crmMailing' => array(
@@ -183,6 +185,8 @@ class CRM_Mailing_Info extends CRM_Core_Component_Info {
           'visibility' => CRM_Utils_Array::makeNonAssociative(CRM_Core_SelectValues::groupVisibility()),
           'workflowEnabled' => CRM_Mailing_Info::workflowEnabled(),
           'reportIds' => $reportIds,
+          'enabledLanguages' => $enabledLanguages,
+          'isMultiLingual' => $isMultiLingual,
         ),
       ))
       ->addPermissions(array(
index a8658a02169707c17fac5ef5b1d7a38c253a9831..2d7474c54c2873d8836c31935b8b8c4a35da69bd 100644 (file)
@@ -122,6 +122,11 @@ class CRM_Mailing_Selector_Browse extends CRM_Core_Selector_Base implements CRM_
           'sort' => 'name',
           'direction' => CRM_Utils_Sort::DONTCARE,
         ),
+        array(
+          'name' => ts('Language'),
+          'sort' => 'language',
+          'direction' => CRM_Utils_Sort::DONTCARE,
+        ),
         array(
           'name' => ts('Status'),
           'sort' => 'status',
@@ -590,6 +595,11 @@ LEFT JOIN  civicrm_contact scheduledContact ON ( $mailing.scheduled_id = schedul
       $clauses[] = '( campaign_id IN ( ' . implode(' , ', array_values($campainIds)) . ' ) )';
     }
 
+    if ($language = $this->_parent->get('language')) {
+      $clauses[] = "civicrm_mailing.language = %6";
+      $params[6] = array($language, 'String');
+    }
+
     if (empty($clauses)) {
       return 1;
     }
index 8b634527d1b82b8b27e96ae4957656fc1287cfaa..40983319c8f9f53a5a20213c5457e8949a9f6bef 100644 (file)
@@ -60,6 +60,7 @@ class CRM_Mailing_Selector_Search extends CRM_Core_Selector_Base implements CRM_
     'contact_id',
     'mailing_id',
     'mailing_name',
+    'language',
     'sort_name',
     'email',
     'mailing_subject',
@@ -358,6 +359,11 @@ class CRM_Mailing_Selector_Search extends CRM_Core_Selector_Base implements CRM_
           'sort' => 'mailing_name',
           'direction' => CRM_Utils_Sort::DONTCARE,
         ),
+        array(
+          'name' => ts('Language'),
+          'sort' => 'language',
+          'direction' => CRM_Utils_Sort::DONTCARE,
+        ),
         array(
           'name' => ts('Mailing Subject'),
           'sort' => 'mailing_subject',
index e4556ef6b16ab38b8b176808d470a99c2de760e0..9836e48a5cc90713de1c18e28a40e7349a6e0067 100644 (file)
@@ -79,5 +79,19 @@ It could perhaps be thinned by 30-60% by making more directives.
         placeholder="Subject"
         name="subject" />
     </div>
+    <div ng-if="crmMailingConst.isMultiLingual">
+      <div crm-ui-field="{name: 'subform.language', title: ts('Language')}">
+        <select
+          crm-ui-id="subform.language"
+          crm-ui-select="{dropdownAutoWidth : true, allowClear: false}"
+          name="language"
+          ng-model="mailing.language"
+          required
+          >
+          <option value=""></option>
+          <option ng-repeat="(key,val) in crmMailingConst.enabledLanguages" value="{{key}}">{{val}}</option>
+        </select>
+      </div>
+    </div>
   </div>
 </div>
index 49b9232a644282f72bd82a1f14b49807952fe686..def183c0109eb864fe95932b85df2325d2510913 100644 (file)
@@ -34,6 +34,9 @@ Required vars: mailing, attachments
         </div>
         <div ng-show="!attachments.files.length && !attachments.uploader.queue.length"><em>{{ts('None')}}</em></div>
       </div>
+      <div ng-if="crmMailingConst.isMultiLingual" crm-ui-field="{title: ts('Language')}">
+        {{crmMailingConst.enabledLanguages[mailing.language]}}
+      </div>
       <div crm-ui-field="{title: ts('Tracking')}">
         <span crm-mailing-review-bool crm-on="mailing.url_tracking=='1'" crm-title="ts('Click-Throughs')"></span>
         <span crm-mailing-review-bool crm-on="mailing.open_tracking=='1'" crm-title="ts('Opens')"></span>
index a68d745fb9195352dfb842ee59d28c2b3f31cfa5..17c29aa020993937f56e61859cb8bc21f3587db2 100644 (file)
         {/if}
     </tr>
 
+    {* language *}
+    {if $form.language}
+      <tr>
+        <td>{$form.language.label} {help id="id-language"}<br />
+            {$form.language.html|crmAddClass:big}
+        </td>
+      </tr>
+    {/if}
+
     {* campaign in mailing search *}
     {include file="CRM/Campaign/Form/addCampaignToComponent.tpl"
     campaignContext="componentSearch" campaignTrClass='' campaignTdClass=''}
index ca61d15cc356796dab53e106dede6e43747419e1..d655f55359379fe1707bf4bc7a12d97f96ef18da 100644 (file)
     </pseudoconstant>
     <add>4.6</add>
   </field>
+  <field>
+    <name>language</name>
+    <title>Mailing Language</title>
+    <type>varchar</type>
+    <length>5</length>
+    <comment>Language of the content of the mailing. Useful for tokens.</comment>
+    <add>4.6</add>
+    <pseudoconstant>
+      <optionGroupName>languages</optionGroupName>
+      <keyColumn>name</keyColumn>
+    </pseudoconstant>
+    <html>
+      <type>Select</type>
+    </html>
+  </field>
 </table>