CiviCRM Community Forums (archive)

*

News:

Have a question about CiviCRM?
Get it answered quickly at the new
CiviCRM Stack Exchange Q+A site

This forum was archived on 25 November 2017. Learn more.
How to get involved.
What to do if you think you've found a bug.



  • CiviCRM Community Forums (archive) »
  • Language and Locality »
  • Francophone User Group (Moderators: mathieu, xavier) »
  • champ de fusion conditionnel dans un modèle d'étiquette
Pages: [1]

Author Topic: champ de fusion conditionnel dans un modèle d'étiquette  (Read 1033 times)

flo81

  • I’m new here
  • *
  • Posts: 21
  • Karma: 1
  • CiviCRM version: 4.5.8
  • CMS version: Drupal 7.34
  • MySQL version: 5.5.40
  • PHP version: 5.4
champ de fusion conditionnel dans un modèle d'étiquette
October 22, 2015, 07:40:58 am
Bonjour,

Concernant l'édition d'étiquettes de publipostage, je souhaiterais faire en sorte que le pays n'apparaisse qui si celui-ci n'est pas la France (ma base comporte à 99% des contacts français). J'ai tenté d'introduire une conditionnelle smarty dans le format d'étiquette (comme j'ai pu le faire pour des modèles de courrier sans soucis) mais comme je m'y attendais ça ne fonctionne pas.

Est-il possible de faire cela sans toucher au code ? Si non quel serait le point d'entrée pour implémenter ça dans un module custom (j'utilise Drupal) ?

Merci

mathieu

  • Administrator
  • Ask me questions
  • *****
  • Posts: 620
  • Karma: 36
    • Work
  • CiviCRM version: 4.7
  • CMS version: Drupal
  • MySQL version: MariaDB 10
  • PHP version: 7
Re: champ de fusion conditionnel dans un modèle d'étiquette
October 22, 2015, 08:32:29 am
C'est possible d'activer Smarty dans les modèles de messages, mais il faut définir une constante dans civicrm.settings.php. Ex: define( 'CIVICRM_MAIL_SMARTY', 1 );  (ça devrait déjà y être, mais commenté, avec une description de ce que ça fait)

Activer Smarty est un léger risque de sécurité, si tu ne fais pas confiance aux gens qui peuvent accéder à l'interface administrative de CiviCRM. Ex: ça pourrait contourner certaines restrictions (car ça donne accès à l'API).

Une autre option serait d'écrire un jeton (token) spécifique aux besoins, qui formatte toute l'adresse, mais sans le pays si c'est une adresse en France.

https://civicrm.org/blogs/colemanw/create-your-own-tokens-fun-and-profit

Ça peut s'implémenter dans une extension CiviCRM ou dans un module Drupal personnalisé.

Mathieu
CiviCamp Montréal, 29 septembre 2017 | Co-founder / consultant / turn-key CiviCRM hosting for Quebec/Canada @ SymbioTIC.coop

flo81

  • I’m new here
  • *
  • Posts: 21
  • Karma: 1
  • CiviCRM version: 4.5.8
  • CMS version: Drupal 7.34
  • MySQL version: 5.5.40
  • PHP version: 5.4
Re: champ de fusion conditionnel dans un modèle d'étiquette
October 22, 2015, 08:44:21 am
J'ai déjà activé Smarty pour les modèles de courriers papier, et je l'utilise au niveau de l'adresse du contact pour ne pas avoir de lignes blanches lorsque les compléments sont vides (je n'affiche ces compléments qui si ils ne sont pas vides).

Mon soucis est pour appliquer le même principe aux modèles d'étiquettes (/civicrm/admin/setting/preferences/address), ça ne semble pas possible (en tout cas le smarty n'est pas interprété).

Merci pour le lien, je vais créer un token pour ça en gérant aussi l'affichage conditionnel des compléments d'adresse, ça me permettra de supprimer la logique smarty dans les modèles de courrier (pas très joli...).


mathieu

  • Administrator
  • Ask me questions
  • *****
  • Posts: 620
  • Karma: 36
    • Work
  • CiviCRM version: 4.7
  • CMS version: Drupal
  • MySQL version: MariaDB 10
  • PHP version: 7
Re: champ de fusion conditionnel dans un modèle d'étiquette
October 22, 2015, 09:20:32 am
Ah ok, en effet, ça ne fonctionne pas à cet endroit. J'aurais formatté l'adresse à la mitaine l'adresse dans le template (en utilisant les différents jetons plus spécifiques), mais un jeton/token personnalisé, c'est effectivement beaucoup plus propre.

C'est un sujet qui revien souvent aux sprints: fournir des formats d'adresses personnalisables selon le pays.
CiviCamp Montréal, 29 septembre 2017 | Co-founder / consultant / turn-key CiviCRM hosting for Quebec/Canada @ SymbioTIC.coop

flo81

  • I’m new here
  • *
  • Posts: 21
  • Karma: 1
  • CiviCRM version: 4.5.8
  • CMS version: Drupal 7.34
  • MySQL version: 5.5.40
  • PHP version: 5.4
Re: champ de fusion conditionnel dans un modèle d'étiquette
October 23, 2015, 03:22:35 am
Voilà ce que j'ai fait pour pouvoir construire un bloc d'adresse un peu comme je le voulais (notamment, pas de lignes blanches si les champs compléments sont vides, pays affiché uniquement si hors de France).

Toute suggestion / avis / correction est bienvenu, c'est mon premier bout de code pour Civi !!

Y aurait-il un endroit plus approprié qu'ici pour poster ce genre de bout de code ? Ça peut être utile à quelqu'un.

Code: [Select]
/**
   * Custom tokens
   * @param $tokens
   */
  function mymodule_civicrm_tokens(&$tokens) {

    // formatted address block : no blank line if supplemental's are empty,
    // no country if it's France
    $tokens['address'] = array(
      // for letters
      'address.adresse_formatee_courriers' => ts('Bloc d\'adresse formatée pour courriers'),
      // for labels : <br> don't work...
      'address.adresse_formatee_etiquettes' => ts('Bloc d\'adresse formatée pour étiquettes')
    );

    // current year only
    $tokens['date'] = array(
      'date.annee' => 'Année courante'
    );
  }

  function mymodule_civicrm_tokenValues(&$values, $cids, $job = null, $tokens = array(), $context = null) {

    $contacts = implode(',', $cids);

    //
    $adressesCourriers = array();
    $adressesEtiquettes = array();

    // get address fields + country name for the contact primary address
    $dao = &CRM_Core_DAO::executeQuery("
      SELECT civicrm_contact.id AS main_id,
             civicrm_address.id,
             civicrm_address.is_primary,
             civicrm_address.street_address,
             civicrm_address.supplemental_address_1,
             civicrm_address.supplemental_address_2,
             civicrm_address.postal_code,
             civicrm_address.city,
             civicrm_address.country_id,
             civicrm_country.name
      FROM civicrm_contact, civicrm_address, civicrm_country
      WHERE civicrm_contact.id IN ($contacts)
      AND civicrm_address.contact_id = civicrm_contact.id
      AND civicrm_address.country_id = civicrm_country.id
      AND civicrm_address.is_primary = 1"
    );

    while ($dao->fetch()) {

      $cid = $dao->main_id;

      // construct the formatted address block, <br/> instead of <p>
      $formattedAddressCourrier = $dao->street_address.'<br/>';

      // labels are not html, <br/> don't work, maybe there is a better solution ?
      $formattedAddressEtiquette = $dao->street_address.'
';

      // avoid blank lines if supplementals are empty
      if($dao->supplemental_address_1) {
        $formattedAddressCourrier .= $dao->supplemental_address_1.'<br/>';
        $formattedAddressEtiquette .= $dao->supplemental_address_1.'
';
      }
      if($dao->supplemental_address_2) {
        $formattedAddressCourrier .= $dao->supplemental_address_2.'<br/>';
        $formattedAddressEtiquette .= $dao->supplemental_address_2.'
';
      }

      // postal code and city
      $formattedAddressCourrier .= $dao->postal_code.' '.$dao->city;
      $formattedAddressEtiquette .= $dao->postal_code.' '.$dao->city;

      // country if not France
      if($dao->country_id != 1076) {
        $formattedAddressCourrier .= '<br/>'.$dao->name;
        $formattedAddressEtiquette .= '
'.$dao->name;
      }

      $adressesCourriers[$cid] = $formattedAddressCourrier;
      $adressesEtiquettes[$cid] = $formattedAddressEtiquette;
    }

    if(!empty($tokens['date'])) {
      $date = array(
        'date.annee' => date('Y'),
      );
    }

    // set tokens values
    foreach ($cids as $cid) {
      if(!empty($date)) {
        $values[$cid] = empty($values[$cid]) ? $date : $values[$cid] + $date;
      }
      if(isset($adressesCourriers[$cid])) {
        $values[$cid]['address.adresse_formatee_courriers'] = $adressesCourriers[$cid];
      }
      if(isset($adressesEtiquettes[$cid])) {
        $values[$cid]['address.adresse_formatee_etiquettes'] = $adressesEtiquettes[$cid];
      }
    }
  }

mathieu

  • Administrator
  • Ask me questions
  • *****
  • Posts: 620
  • Karma: 36
    • Work
  • CiviCRM version: 4.7
  • CMS version: Drupal
  • MySQL version: MariaDB 10
  • PHP version: 7
Re: champ de fusion conditionnel dans un modèle d'étiquette
November 11, 2015, 08:39:46 am
Merci d'avoir partagé!

Je ne suis pas sûr où documenter, mais j'ai ajouté une note ici dans le wiki pour fr_CA:
http://wiki.civicrm.org/confluence/display/CRMDOC/French+Canadian+localization+settings

Sinon la meilleure page serait:
http://wiki.civicrm.org/confluence/display/CRMDOC/i18n+Administrator's+Guide%3A+Using+CiviCRM+in+your+own+language
CiviCamp Montréal, 29 septembre 2017 | Co-founder / consultant / turn-key CiviCRM hosting for Quebec/Canada @ SymbioTIC.coop

Pages: [1]
  • CiviCRM Community Forums (archive) »
  • Language and Locality »
  • Francophone User Group (Moderators: mathieu, xavier) »
  • champ de fusion conditionnel dans un modèle d'étiquette

This forum was archived on 2017-11-26.